我有一个声明为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);
char* first=strtok(st," ");
char* second=strtok(NULL," ");
printf("nstring s at the end is %sn",s);
global=second;
printf("nsecond after assigning to blobal is is %sn",second);
printf("n global at end of parse function is %s",global);
}
但是,当我从另一个函数调用这个全局变量并测试打印其值时,它只打印字符串的一部分,而不是像上面函数末尾那样打印整个字符串。
我知道我所做的不是最优的,但我不明白为什么全局变量在稍后的程序中被调用时会发生变化。
在函数中,您可以将global赋值为指向堆栈上的缓冲区。
当函数存在时,st
不再是您的。
将CCD_ 2自身改变为缓冲器。
不,你不能安全地做到这一点:
char st[30];
char * second=strtok(NULL," ");
global = second;
上面的第一行在函数中创建了一个局部变量(将一些字符串复制到其中(。
第二行在该字符串的中为您提供一个地址,第三行将该地址分配给全局变量。
不幸的是,st
对象在函数末尾超出了作用域,因此不允许通过取消引用指向它的地址来使用它。
可能发生的事情(尽管这无关紧要(是存储st
的堆栈区域正在以某种方式被重用;破坏性的";CCD_ 5变量所指向的字符串。
我说";"无关";由于单词";堆叠";在ISO C标准中大约出现零次。基本规则是,你需要遵循标准,否则可能会发生不好的事情。这些糟糕的事情是什么完全取决于实现:-(
在修复它方面,在需要使用它之前,你基本上需要确保信息到达不会超出范围的地方。例如,可以将global
设置为字符数组(很像st
(而不是指针,并将strcpy
设置为它。
或者,让您的函数分配在函数退出后仍然存在的内存,例如with(如果您的实现没有提供strdup
,请参阅此处(:
global = strdup(second);
只要记住free
,一旦你完成了它的记忆。