这可能最终成为一个愚蠢的问题。我做了以下功能:
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;
}
这会返回一个'Strings'数组,重要的代码块是这样的:
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*));
答案 0 :(得分:2)
根据我对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]
中进行非法访问。分配行+ 1是一种解决方法。内容未知,可能性没有.
,使得while条件评估为false而没有非法访问。
我建议确保最后一次迭代中存在.
,或者在您的while条件中包含i < ROWS
之类的内容