为什么我的 C 代码在引用同一个变量时打印出不同的值?

Why does my C code print out different values when referring to the same variable?

这是我第一次尝试回答关于 Whosebug 的问题 -

我在 C 中实现了以下内容:

当运行我的程序时,我发现打印出的hashstring的值在以下两个函数中是不同的:

void foo() {
    ...
    Obj *obj = Obj(args);
    char *hashstring = getHash(obj);
    printf("My value of hashstring: %s\n", hashstring);
    ...
}

char* getHash(Obj *obj) {
    ...
    int hashint = getHashInt(args);
    // I am trying to do a conversion from int to string here
    char hashstring[12]; 
    sprintf(hashstring, "%d", hashint);
    printf("My value of hashstring: %s\n", &hashstring);
    return &hashstring;
}

这是打印出来的内容:
我的 hashstring 值:1001 // 在 getHash 中打印:这是预期的
我的哈希字符串值:0
我的 hashstring 值:2002 // 在 getHash 中打印:这是预期的
我的哈希字符串值:0
我的 hashstring 值:3003 // 在 getHash 中打印:这是预期的
我的 hashstring 值:0

我尝试通过在 foo() 中打印 hashstring 的指针来调试。似乎在每次调用中,我都得到相同的 hashstring 地址。

这是打印出来的内容:
0x7ffee1992f54
0x7ffee1992f54
0x7ffee1992f54

我猜这可能意味着我在 getHash() 中以某种方式引用了相同的 hashstring 变量,这很奇怪,因为我每次都在创建一个新变量。我还在 getHash() 中尝试了其他变体,例如 snprintf(hashstring, 12, "%d", hashint),或者创建一个 char *pointerToHash 并将 *pointerToHash 传递给 sprintf.

有什么想法吗?

这个函数

char* getHash(Obj *obj) {
...
int hashint = getHashInt(args);
// I am trying to do a conversion from int to string here
char hashstring[12]; 
sprintf(hashstring, "%d", hashint);
printf("My value of hashstring: %s\n", &hashstring);
return &hashstring;
}

调用未定义的行为,因为它return是指向本地数组的指针

 char hashstring[12]; 

退出函数后不会存活

此外,函数 return 的类型 char * 和 returned 表达式 char ( * )[12] 的类型不同,并且没有从一种类型到另一个。

为避免此问题,您应该动态分配数组,例如

char *hashstring = calloc( 12, sizeof( char ) );

并在 return 语句中写入

return hashstring;

然后在调用者中,当不再需要分配的数组时,您应该释放分配的内存。