【发布时间】:2021-04-16 20:29:28
【问题描述】:
这是我第一次尝试关于 stackoverflow 的问题 -
我在 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() 中打印哈希字符串的指针来进行调试。似乎在每次调用中,我都得到了相同的哈希字符串地址。
打印出来的内容如下:
0x7ffee1992f54
0x7ffee1992f54
0x7ffee1992f54
我猜这可能意味着我在 getHash() 中以某种方式引用了相同的哈希字符串变量,这很奇怪,因为我每次都在创建一个新变量。我还尝试了其他变体,例如 getHash() 中的 snprintf(hashstring, 12, "%d", hashint),或者创建一个 char *pointerToHash 并将 *pointerToHash 传递给 sprintf。
有什么想法吗?
【问题讨论】:
-
请发帖minimal reproducible example。缩进也有帮助。
-
首先,在两个不同的函数中使用同名的局部变量会造成混淆。
getHash中的数组hashstring是本地的,当getHash返回时,它的生命周期结束。所以返回它的地址会导致main不能使用的指针。如您所见,该记忆可能随时被其他内容覆盖。一个好的编译器应该给你警告。 -
请给minimal reproducible example,重点是完整
标签: c debugging scope undefined-behavior