有人可以告诉我为什么这段代码不起作用?我尝试使用gcc 6.3编译并运行它,但printf的结果是一种内存混乱:“P @”而不是“某事”。在https://www.jdoodle.com/c-online-compiler上用gcc 5.3编译它,给出了确切的结果(“某事”)。
#include <stdio.h>
char *vari;
void foo(char **ts)
{
char buffer[] = "something";
*ts = &buffer[0];
}
int main (void)
{
foo(&vari);
printf("vari: %s\n", vari);
}
答案 0 :(得分:3)
buffer[]
自动存储时间。
使用在该函数调用者中设置为其地址的指针将导致未定义的行为。
如果你写了
,那将是另一回事static const char* buffer = "something";
代替。
答案 1 :(得分:2)
这是未定义的行为。访问其范围之外的自动存储生命周期元素可能会导致任何。
当foo()
函数结束时,buffer
的内存被释放。
您可以通过不同的方式解决问题
设置buffer
静态存储时间。
分配内存,然后将文字"somehting"
复制到其中,并将其分配给*ts
。