释放malloc不会删除char数据

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的值.

cni*_*tar 7

您正在使用buff而不初始化它.尝试:

char buff[1024];
buff[0] = 0;
Run Code Online (Sandbox Code Playgroud)

我觉得奇怪的是,我可以在释放后立即打印newStr的值.

释放后访问内存是未定义的行为.通常,出于性能原因,free不会将内存归零.

这是同一个问题中2个未定义行为的情况+一个非常奇怪typedef.保持!