1

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

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 
+0

Почему вы не публикуете полный код? мы не можем найти определение вашей строки и столбца. Являются ли они глобальными переменными? Возможно, проблема заключается в том, что вы разделили строку/столбец между основным и FParser. – Francis

+0

вы можете исправить свой список кодов, я думаю, что он не содержит деклараций и закрывающей скобки, их трудно прочитать. – Anycorn

ответ

8

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

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

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

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

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

Он работает! Спасибо, Джеймслин, за ваш ответ и совет. – anonymous

+1

@ heckler01: Не забудьте принять ответы. ;) – jamesdlin

+0

Фактически, 'char string [256]' parameter * is * типа 'char *' ('sizeof string' не будет оцениваться, например,' 256'). – caf