gpt4 book ai didi

c - 内存泄漏与 valgrind

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:28 28 4
gpt4 key购买 nike

这可能最终会成为一个愚蠢的问题。我完成了以下功能:

char **getArrayOfStrings(int rows, int cols){
int i;
char **aux = malloc(rows * sizeof(char*));

for(i = 0; i < rows; i++)
aux[i] = malloc(cols+1);

return aux;
}

这会返回一个“字符串”数组,重要的代码块是这样的:

void f(...)
{
char **arrayOfStrings;
int i = 0;
arrayOfStrings = getArrayOfStrings(ROWS,COLS);

while(ch != '.' && sscanf (globalString,"%[^,|.]s", arrayOfStrings[i]) > 0)
{
globalString += strlen(arrayOfStrings[i++]) + 1;
ch = (*globalString-1); /** take the terminal characters */
}

freeMemory(&arrayOfStrings,ROWS);

}

freeMemory 在哪里:

void freeMemory(char ***matrix, int size){
int i;

for(i = 0; i < size; i++) free((*matrix)[i]);

free(*matrix);

*matrix = NULL;
}

完成我的应用程序后,我使用 valgrind 运行以查找内存泄漏(我第一次使用 valgrind)。

我收到以下错误:

Finding Invalid Pointer Use With Valgrind

==25012== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==25012== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==25012== Command: dist/Debug/GNU-MacOSX/app
==25012==
==25012== Invalid read of size 8
==25012== at 0x406445: f (Data.c:24)
==25012== by 0x400BE3: main (main.c:27)

我不知道我错过了什么,因为函数 getArrayOfStrings 对我来说似乎非常好(好吧,我本可以只使用一个 malloc,但那是另一个问题)。


编辑

valgrind 指示的行是这个 f (Data.c:24):

char **aux = malloc(rows * sizeof(char*));

最佳答案

根据我使用 valgrind 的经验,它准确地显示了是否进行了非法访问。但是,您的输出似乎只显示了与非法访问相关的指针及其分配位置。

这意味着我们可能查看了错误的代码行。

仔细观察您的 while 循环:

 while(ch != '.' && sscanf (globalString,"%[^,|.]s", arrayOfStrings[i]) > 0)       
{
globalString += strlen(arrayOfStrings[i++]) + 1;
ch = (*globalString-1); /** take the terminal characters */
}

如果出于某种原因,在最后一行 ch不等于 .将在 arrayOfStrings[rows] 中进行非法访问.分配 rows+1 是一种解决方法。内容未知,很可能没有 .在那里,使 while 条件评估为 false,没有非法访问。

我建议要么确保一个 .出现在最后一次迭代中或包含类似 i < ROWS 的内容在你的 while 条件下

关于c - 内存泄漏与 valgrind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15853675/

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