C 为什么我的程序有内存泄漏?
我正在尝试创建一个小的c程序,它可以读取任意大小的字符串,而不会有任何内存泄漏 根据我的研究,可以使用函数malloc为我们想要存储的任何数据分配一定数量的字节 在我的程序中,我首先为0个字符分配空间,并使指针指向它。然后,每当我读取单个字符时,我都会制作一个指针oldWord,指向word,一旦我为新字符分配了更大的内存位置,它就会释放旧内存位置 我的研究表明,free功能可以用来释放不再需要的旧内存位置。然而,我不确定我错在哪里。下面你可以看到我的代码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.
#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
返回的所有可能值,例如EOF。您应该使用getchar()
类型,这就是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)
未指定是否为空指针(未定义实现)