【问题标题】:Converting char* to int after using strdup()使用 strdup() 后将 char* 转换为 int
【发布时间】:2013-03-23 11:05:22
【问题描述】:

为什么在使用 strdup(value) (int)value 后返回的输出与以前不同? 如何获得相同的输出?

我的简短示例出错了,请使用长示例: 这里是完整的测试代码:

#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;
}

【问题讨论】:

  • 他们不平等不是好事吗?如果是的话,它不会是太多的副本......
  • 如何得到相同的输出?不要调用 strdup!
  • 您确定需要(int)c,而不是atoi(c)?\
  • 在 64 位 Windows 上的 VC++ 中,int 是 32 位,但指针是 64 位。不要使用int 来存储指针,因为它不能保证适合。
  • 不保证cca 在第一部分也将相等。它是实现定义的。

标签: c++ c pointers type-conversion strdup


【解决方案1】:

由于在您的情况下数组衰减为指针,因此您正在打印 指针(即,在非异国计算机上,内存地址)。不能保证指针适合int

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

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

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

【讨论】:

  • 不错的答案(我喜欢在非异国计算机上的内存地址
【解决方案2】:

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

所以指针不同也是可以理解的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2015-11-23
    相关资源
    最近更新 更多