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

C 为什么我的程序有内存泄漏?,c,pointers,memory-leaks,malloc,dynamic-memory-allocation,C,Pointers,Memory Leaks,Malloc,Dynamic Memory Allocation,我正在尝试创建一个小的c程序,它可以读取任意大小的字符串,而不会有任何内存泄漏 根据我的研究,可以使用函数malloc为我们想要存储的任何数据分配一定数量的字节 在我的程序中,我首先为0个字符分配空间,并使指针指向它。然后,每当我读取单个字符时,我都会制作一个指针oldWord,指向word,一旦我为新字符分配了更大的内存位置,它就会释放旧内存位置 我的研究表明,free功能可以用来释放不再需要的旧内存位置。然而,我不确定我错在哪里。下面你可以看到我的代码 #include <stdio.

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

根据我的研究,可以使用函数malloc为我们想要存储的任何数据分配一定数量的字节

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

我的研究表明,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';
}
#包括
#包括
内部主(空){
char*word=malloc(0);
printf(“输入名称:”);
readWord(word);
printf(“您的名字是:%s\n”,word);
免费(字);
word=realloc(0);
printf(“输入名称:”);
readWord(word);
printf(“您的名字是:%s\n”,word);
免费(字);
返回0;
}
无效读字(字符*字){
int i=0;
char*oldWord,c=getchar();
而(c!=''&&c!='\n'){
oldWord=单词;
word=realloc(word,i+1);
免费(旧词);
字[i++]=c;
c=getchar();
}
oldWord=单词;
word=realloc(word,i+1);
免费(旧词);
字[i]='\0';
}

我在这里看到的问题是

   free(oldWord);
未检查
realloc()
故障。如果
realloc()
成功,则将同一指针传递给
free()
原因

也就是说,还有一些注释

  • 语法类似于

    word = realloc(word, i + 1);
    
    是危险的,如果
    realloc()
    失败,您也将丢失实际指针。您应该使用一个临时指针来保存
    realloc()
    的返回值,检查是否成功,然后根据需要将其分配回原始指针

  • 在您的代码中,
    c
    属于
    char
    类型,它可能不足以保存
    getchar()
    返回的所有可能值,例如EOF。您应该使用
    int
    类型,这就是
    getchar()
    返回的内容


您的代码中存在多个问题:

  • 您可以
    释放传递给
    realloc()
    的指针。这是不正确的,因为如果块被移动,
    realloc()
    将已经释放内存。 否则指针将被释放两次

  • 重新分配的指针bu
    readWord()
    永远不会传回调用方

  • 分配大小为0的块具有未指定的行为:它可能返回
    NULL
    或不应取消引用的有效指针,但可以传递给
    free()
    realloc()

  • 您不需要测试文件结尾:如果文件中没有空格或换行符,则会出现无限循环,例如,如果文件为空

  • 在调用
    readWord()
    之前,您没有它的原型

以下是一个改进但过于简单的版本:

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

char *readWord(void);

int main(void) {
    char *word;

    printf("Enter name: ");
    word = readWord();
    if (word == NULL) {
        printf("Unexpected end of file\n");
    else
        printf("Your name is: %s\n", word);

    free(word);
    return 0;
}

char *readWord(void) {
    int c;
    size_t i = 0;
    char *word = NULL;

    while ((c = getchar()) != EOF && !isspace(c)) {
        word = realloc(word, i + 2);
        if (word == NULL)
            break;
        word[i++] = c;
        word[i] = '\0';
    }
    return word;
}
#包括
#包括
#包括
字符*读字(无效);
内部主(空){
字符*字;
printf(“输入名称:”);
word=readWord();
if(word==NULL){
printf(“意外的文件结尾\n”);
其他的
printf(“您的名字是:%s\n”,word);
免费(字);
返回0;
}
char*readWord(无效){
INTC;
尺寸i=0;
char*word=NULL;
while((c=getchar())!=EOF&&!isspace(c)){
word=realloc(word,i+2);
if(word==NULL)
打破
字[i++]=c;
字[i]='\0';
}
返回词;
}

可能重复的
realloc
会使传入的指针无效。这意味着您不应该
释放它,但您需要释放从
realloc
返回的指针;
char*word=NULL;
char*word=malloc(0);
malloc(0)
未指定是否为空指针(未定义实现)