我为我的大问题做了一个较小的场景。我尝试做的是将字符串传递给一个函数,该函数将从中创建一个新字符串。但是我遇到了一些问题。
我已将字符串定义为
typedef char string[1024];
然后我有一个函数,它接受一个字符串并创建一个新字符串,该字符串填充了旧字符串和一个点字符
string* add_sth_to_string(char* msg){
string* newStr=malloc(sizeof(string)); // malloc a newStr
strcpy(*newStr, msg); // copying msg to newStr
char buff[1024]; // making a buffer
strcat(buff, "."); // adding a dot to buffer
strcat(buff, *newStr); // adding msg to buffer
strcpy(*newStr, buff); // copying buffer to newStr
return newStr;
}
然后在 main 中,我尝试每次对新字符串使用此函数 3 次:
for (i=0; i<3; i++){
string* newStr;
newStr=add_sth_to_string("test");
printf("str: %sn", *newStr);
free(newStr);
// can even printf here
}
这是我得到的奇怪输出:
str: .test
str: .test.test
str: .test.test.test
当我期望得到:
str: .test
str: .test
str: .test
有人能指出正在发生的事情吗?我觉得奇怪的另一件事是,我可以在释放 newStr 后立即打印它的值。
您在使用buff
时没有对其进行初始化。尝试:
char buff[1024];
buff[0] = 0;
我觉得奇怪的另一件事是我可以打印 newStr 的值 就在我释放它之后。
释放内存后访问内存是未定义的行为。通常,出于性能原因,free
不会将内存清零。
这是同一问题中未定义行为的 2 个案例 + 一个非常奇怪的typedef
.坚持下去!
尝试更改
strcat(buff, ".");
到
strcpy(buff, ".");
或者在声明时交替初始化buff
,如下所示:
char buff[1024] = "";
您应该清除每次迭代buf[1024]
的内容。
更新
因为buf[1024]
在堆栈上分配时不会自动归零。你选择strcat
连接两个字符串,这将找到一个