为什么我的 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;
然后在调用者中,当不再需要分配的数组时,您应该释放分配的内存。
这是我第一次尝试回答关于 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;
然后在调用者中,当不再需要分配的数组时,您应该释放分配的内存。