gpt4 book ai didi

c - 为什么我的程序有内存泄漏?

转载 作者:太空宇宙 更新时间:2023-11-04 01:51:01 25 4
gpt4 key购买 nike

我正在尝试创建一个小型 c 程序,它将读取任意大小的字符串,而不会出现任何内存泄漏。

根据我的研究,ma​​lloc 函数可用于为我们要存储的任何数据分配一定数量的字节。

在我的程序中,我首先为 0 个字符分配空间,然后让指针 word 指向它。然后,每当我读取单个字符时,我都会创建一个指向 word 的指针 oldWord,一旦我为新字符分配更大的内存位置,它就会释放旧的内存位置。

我的研究表明,free 函数可用于释放不再需要的旧内存位置。但是,我不确定我哪里出错了。下面你可以看到我的代码。

#include <stdio.h>
#include <stdlib.h>

int main(void){
char *word = malloc(0);

printf("Enter name: ");
readWord(word);
printf("Your name is: %s\n", word);

free(word);

word = realloc(0);

printf("Enter name: ");
readWord(word);
printf("Your name is: %s\n", word);

free(word);

return 0;
}

void readWord(char *word){
int i = 0;
char *oldWord, c = getchar();

while(c != ' ' && c != '\n'){
oldWord = word;
word = realloc(word, i + 1);
free(oldWord);
word[i++] = c;
c = getchar();
}

oldWord = word;
word = realloc(word, i + 1);
free(oldWord);
word[i] = '\0';
}

最佳答案

我在这里看到的问题是

   free(oldWord);

没有检查 realloc()失败。如果 realloc() 成功,将相同的指针传递给 free() 会导致 undefined behavior .

也就是说,还有一些笔记

  • 像这样的语法

    word = realloc(word, i + 1);

    是危险的,万一 realloc() 失败,您也会丢失实际的指针。您应该使用一个临时指针来保存 realloc() 的返回值,检查是否成功,然后才在需要时将其分配回原始指针。

  • 在您的代码中,cchar 类型,它可能不足以容纳getchar()< 返回的所有可能值,例如 EOF。您应该使用 int 类型,这就是 getchar() 返回的类型。

关于c - 为什么我的程序有内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43025428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com