1

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

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*));
4

1 回答 1

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 且没有非法访问。

我建议要么确保 a在最终迭代中出现,要么在你的 while 条件中.包含类似的东西i < ROWS

于 2013-04-06T18:36:45.023 回答