Передать по ссылке 2D динамически распределяемый двойной массив в C - PullRequest
1 голос
/ 24 января 2010

Я пытаюсь преобразовать мою строку в динамический массив значений типа double. Каждый пробел в моей строке представляет столбец, каждый ";" представляет новый ряд. Когда этот код выполняется, он работает только тогда, когда * F [0] [col]. Когда он достигает * F [1] [col], он выдает мне сообщение об ошибке «Необработанное исключение в 0x00e4483c в CCode.exe: 0xC0000005: расположение чтения нарушения доступа 0xcccccccc.» Кто-нибудь знает почему?

void main(void) {  
    double **F = NULL;  
    F = malloc(row * sizeof (double *));  
    for (m=0; m < row;m++) {  
        F[m] = malloc(col * sizeof(double ));
    }  
    FParser(string, &F);
for (m=0;m<rowF;m++)
    free(F[m]);
free(F);
}

void FParser(char string[256], double ***F) {  
  while (dummyChar_ptr != NULL) {
    dummyChar_ptr = strtok(dummyChar_ptr," ");
    while ((dummyChar_ptr) != NULL) {
      *F[row][col] = atof(dummyChar_ptr);
      dummyChar_ptr = strtok(NULL," ");
      col++;
    }
    col=0;
    row++;
    strcpy(dummyChar,string);
    dummyChar_ptr = strtok(dummyChar,";");
    for (x=0;x<row;x++) 
      dummyChar_ptr = strtok(NULL,";");  

  }

//example String: 1 0.1 0 0; 0 1 0 0; 0 0 1 0.1; 0 0 0 0.1

1 Ответ

8 голосов
/ 24 января 2010

[] имеет более высокий приоритет, чем унарный * в C, поэтому *F[row][col] на самом деле *(F[row][col]), и вы выполняете индексацию в неправильной ячейке памяти.

Попробуйте (*F)[row][col]).

Между прочим, нет никакой причины для FParser принимать double*** в любом случае. F уже указатель; просто передайте это. Единственная причина, по которой вам нужно использовать дополнительный уровень косвенности, - это если FParser необходимо изменить то, на что указывает main() F.

Другие разные советы:

  • Проверьте, успешно ли malloc.
  • Избегайте глобальных переменных.
  • Не используйте strcpy, если вы не проверили, что исходная строка не переполнит целевой буфер.
  • Параметр функции char string[256] на самом деле не гарантирует, что входной аргумент является массивом из 256 (или более) элементов, поэтому IMO это бессмысленно и может быть char* string.
...