2013-04-06 2 views
1

Это может быть конец, являющийся глупым вопросом. Я сделал следующие функции:Утечка памяти с valgrind

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 кажется прекрасно ко мне (ну я мог бы использовать только один таНос но это другая проблема).


EDIT.

Линия, Valgrind указывают на это один е (Data.c: 24):

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

Что 'freeMemory'? – chris

+2

Как вы используете 'arrayOfStrings'? – md5

+3

Что находится в строке номер 24 в Data.c, и что находится в строке номер 27 в main.c? –

ответ

2

В моем опыте с Valgrind, он точно показывает, были неправомерный доступ осуществляется. Однако кажется, что на вашем выходе отображается только указатель, который связан с незаконным доступом и где он выделен.

Значение может быть неправильным.

Приглядевшись в вашем время цикла:

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, без незаконного доступа.

Я предлагаю либо сделать уверен, что . присутствует на последней итерации или в том числе что-то вроде i < ROWS в вашем состоянии в то время как

+1

Хорошее место - мой «ответ» на самом деле является обходным путем - больше попыткой понять проблему, которую я не мог получить в комментариях. Я удалил его, так как он ничего не добавил к вопросу. –

Смежные вопросы