C全局变量在不同函数中使用时被截断
我有一个声明为char*global=NULL的全局变量和一个解析单独字符串但将其值复制到全局变量中的函数。实际上是将字符串中的第二个字复制到全局变量中。在这个函数的最后一个print语句中,它正确地打印出了全局变量,它再次包含字符串的第二个字C全局变量在不同函数中使用时被截断,c,variables,global,C,Variables,Global,我有一个声明为char*global=NULL的全局变量和一个解析单独字符串但将其值复制到全局变量中的函数。实际上是将字符串中的第二个字复制到全局变量中。在这个函数的最后一个print语句中,它正确地打印出了全局变量,它再次包含字符串的第二个字 void parsestring(char* s, char** ssp){ int i; char st[30]; strcpy(st,s); printf("String st after copy is %s",st
void parsestring(char* s, char** ssp){
int i;
char st[30];
strcpy(st,s);
printf("String st after copy is %s",st);
char* first=strtok(st," ");
char* second=strtok(NULL," ");
printf("\nstring s at the end is %s\n",s);
global=second;
printf("\nsecond after assigning to blobal is is %s\n",second);
printf("\n global at end of parse function is %s",global);
}
但是当我从另一个函数调用这个全局变量并测试打印它的值时,它只打印字符串的一部分,而不是像上面函数末尾那样打印整个字符串
我知道我所做的不是最优的,但我不明白为什么在我的程序中稍后调用全局变量时会发生更改。不,您不能安全地这样做:
char st[30];
char * second=strtok(NULL," ");
global = second;
上面的第一行在函数中创建了一个局部变量(您将一些字符串复制到其中)
第二行给出该字符串中的地址,第三行将该地址分配给全局变量
不幸的是,st
对象超出了函数末尾的范围,因此不允许您使用它,例如,取消对指向它的地址的引用
可能发生的情况(尽管这与此无关)是,存储
st
的堆栈区域以某种方式被重用,“破坏”了全局
变量所指向的字符串
我说“无关”,因为“堆栈”一词在ISO C标准中出现的次数大约为零。基本规则是,你需要遵守标准的规定,否则可能会发生坏事。这些坏东西是什么完全取决于实现:-)
在修复方面,您基本上需要确保信息在需要使用之前不会超出范围。例如,可以将
global
设置为字符数组(很像st
)而不是指针,并将strcpy
设置为指向它
或者,让您的函数分配在函数退出后仍然有效的内存,例如(请查看您的实现是否未提供strdup
):
只要记住,一旦使用完内存,就要释放它。在函数中,您可以将global赋值为指向堆栈上的缓冲区 当函数存在时,
st
不再属于您
将
global
本身更改为缓冲区。st
是局部变量。它只存在于函数内部。在函数外部访问它是未定义的行为。这正是您通过保持指向它的全局指针并在函数外部访问该指针所做的。这是否回答了您的问题?ssp
在这个函数中的作用是什么?我想无数的老师、书籍作者和C老手告诉你不要使用全局变量是对的。
global = strdup(second);