Pit*_*kos -1 c string malloc concatenation
我做了一个更大问题的小方案.我尝试做的是将一个字符串传递给一个函数,该函数将从中生成一个新的字符串.但是我遇到了一些问题.
我已将字符串定义为
typedef char string[1024];
Run Code Online (Sandbox Code Playgroud)
然后我有一个函数,它接受一个字符串,并创建一个新的字符串,填充旧的字符串和一个点字符
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;
}
Run Code Online (Sandbox Code Playgroud)
然后在main中我尝试每次使用此函数3次换一个新字符串:
for (i=0; i<3; i++){
string* newStr;
newStr=add_sth_to_string("test");
printf("str: %s\n", *newStr);
free(newStr);
// can even printf here
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的奇怪输出:
str: .test
str: .test.test
str: .test.test.test
Run Code Online (Sandbox Code Playgroud)
当我希望得到:
str: .test
str: .test
str: .test
Run Code Online (Sandbox Code Playgroud)
谁可以指出发生了什么?我觉得奇怪的是,我可以在释放后立即打印newStr的值.
您正在使用buff而不初始化它.尝试:
char buff[1024];
buff[0] = 0;
Run Code Online (Sandbox Code Playgroud)
我觉得奇怪的是,我可以在释放后立即打印newStr的值.
释放后访问内存是未定义的行为.通常,出于性能原因,free不会将内存归零.
这是同一个问题中2个未定义行为的情况+一个非常奇怪typedef.保持!