2013-03-23 67 views
4

为什么使用strdup(value)(int)value回报你不同的输出比以前后()? 如何获得相同的输出?转换的char *使用的strdup后诠释

我的小例子坏了,请使用长一个: 这里的完整代码测试:

#include <stdio.h> 
#include <iostream> 

int main() 
{ 

    //The First Part 
    char *c = "ARD-642564"; 
    char *ca = "ARD-642564"; 

    std::cout << c << std::endl; 
    std::cout << ca << std::endl; 

//c and ca are equal 
    std::cout << (int)c << std::endl; 
    std::cout << (int)ca << std::endl; 


    //The Second Part 
    c = strdup("ARD-642564"); 
    ca = strdup("ARD-642564"); 

    std::cout << c << std::endl; 
    std::cout << ca << std::endl; 

//c and ca are NOT equal Why? 
    std::cout << (int)c << std::endl; 
    std::cout << (int)ca << std::endl; 

    int x; 
    std::cin >> x; 
} 
+4

他们不平等是不是一件好事?如果他们是,它不会是太多的副本... – FatalError 2013-03-23 11:07:07

+0

如何获得相同的输出?不要调用strdup! – john 2013-03-23 11:08:33

+0

你确定你需要'(INT)C',没有'的atoi(C)'?\ – 2013-03-23 11:10:39

回答

7

由于阵列衰减到您的案例中的指针,您正在打印指针(即在非特定计算机上,一个内存地址)。不能保证指针适合int

  • 在你的代码的第一部分,cca不必相等。您的编译器执行一种内存优化(请参阅here以获得完整答案)。

  • 在第二部分中,strdup动态分配的字符串两次,使得返回的指针不相等。编译器不会优化这些调用,因为他似乎无法控制strdup的定义。

在两种情况下,cca可以不相等。

+0

现在我明白了,谢谢! – Rodion 2013-03-23 11:23:22

+0

尼斯的答案(和我一样非异国情调的电脑*,一个内存地址*) – 2013-03-23 11:28:56

4

“的的strdup()函数将返回一个指针一个新的字符串,这是由s1指向的字符串的副本。“ source

所以指针不同是很容易理解的。