C语言 释放 malloc 不会删除字符数据



我为我的大问题做了一个较小的场景。我尝试做的是将字符串传递给一个函数,该函数将从中创建一个新字符串。但是我遇到了一些问题。

我已将字符串定义为

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连接两个字符串,这将找到一个终止。因此,如果buf包含一些默认值,它将引入模糊处理输出。

使用buf[1024] = "";分配缓冲区将更正输出。

string* newStr=malloc(sizeof(string)); // malloc a newStr
strcpy(*newStr, msg);            // copying msg to newStr

这也将崩溃。 string是一个指针,所以它的大小将返回 4 或 8,而不是你想要做的。

好吧,忘记我说你做了一个typedef,但我让它在这里告诉你为什么typedef是一个主意。乍一看,它混淆了它是一个数组而不是指针的事实,在 30 行的程序中这不是问题,但是当你必须维护一个 200 000 行的项目时(就像我一样(,你会开始讨厌这些东西。

另一点,您应该避免使用 1024 字节的固定大小字符串。 1024 不是那么大(即使是 80 年代的家用电脑也有比这更大的屏幕(,对于大多数人来说,如果字符串相当短,你会白白破坏很多内存。

相关内容

  • 没有找到相关文章

最新更新