gpt4 book ai didi

c - 如何修复 malloc() 的控制台返回 : memory corruption (fast)

转载 作者:行者123 更新时间:2023-11-30 18:38:43 26 4
gpt4 key购买 nike

当我运行程序时,我的控制台输出显示以下内容:ma​​lloc():内存损坏(快速),后面跟着看起来像是内存中的地址。我已将其范围缩小到几个函数,但我觉得我释放了正确分配的所有内存。

以下函数采用表示文件名的字符串。

void readAndProcessFile(char* filename){

FILE *fileptr;
char* word = malloc(32*sizeof(char));

fileptr = fopen(filename, "r");

while(fscanf(fileptr,"%s",word) != EOF){
processWord(word);
}

fclose(fileptr);
free(word);
}

此函数接受一个单词,删除所有非字母字符并将所有字母更改为大写。

void processWord(char* text){
char* processedWord;
processedWord = trimAndCaps(text);

if(processedWord != NULL && processedWord[0] != '\0'){
addWord(processedWord);
}
free(processedWord);
}

这是修剪和闭包功能

char* trimAndCaps(char* text)
{
int i = 0;
int j = 0;
char currentChar;
char* rv = malloc(sizeof(text));

while ((currentChar = text[i++]) != '\0')
{
if (isalpha(currentChar))
{
rv[j++] = toupper(currentChar);
}
}
rv[j] = '\0';

return rv;
}

为了更好地衡量,这里有 addWord 函数

void addWord(char* word)
{
// check if word is already in list
struct worddata* currentWord = findWord(word);

// word is in list
if(currentWord != NULL)
{
incrementCount(currentWord);
}
// word is not in list
else
{
currentWord = malloc(sizeof(struct worddata));
currentWord->count = 1;
strcpy(currentWord->word, word);
ll_add(wordList, currentWord, sizeof(struct worddata));
free(currentWord);
}
}

如您所见,我手动分配内存的所有实例都会在之后释放。该程序在单词量较少时有效,但在单词量较多时则无效。我的思考过程让我相信存在某种泄漏,但是当我有足够的单词可以运行它时,我运行以下代码:

// The following code will print out the final dynamic memory used
struct mallinfo veryend = mallinfo();
fprintf(stderr, "Final Dynamic Memory used : %d\n", veryend.uordblks);

每次使用的内存都显示为 0。还有什么可能导致这种情况?非常感谢任何指导或修复。

最佳答案

以下行不会执行您希望的操作:

char* rv = malloc(sizeof(text));

它仅分配 48 字节或内存,具体取决于平台上指针的大小。

您需要:

char* rv = malloc(strlen(text) + 1);

关于c - 如何修复 malloc() 的控制台返回 : memory corruption (fast),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32856362/

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