Ошибка сегментации при присвоении значений динамическому двумерному массиву в C - PullRequest
0 голосов
/ 02 апреля 2011

Привет, я пишу программу на C, однако при запуске программы я получаю ошибку сегментации.

Я использую gcc для компиляции, и во время компиляции не выдаются предупреждения или ошибки.

Я попытался с помощью gdb отследить происхождение segfault, и он направил меня к строке, где я назначаю значения данных для моего двумерного массива: array [row] [column] = datavalue;

КогдаЯ запускаю свою программу, хранит 3 значения данных и затем обнаруживает ошибки.Он должен хранить данные в 424 строках по 117 столбцов, но последовательно он отображает ошибки после сохранения только трех значений данных.

Мой код выглядит следующим образом (некоторые детали не указаны):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void allmem(float** fpdata,...);            // allocate memory header
void stored(float** fpdata,...);            // store data header
void countnumber(int* num1, int*num2,...);  // count header

int main()   // main() function
{
int numberofrows = 424; // number of rows
float** fpdata;         // two dimensional array fpdata of floats

allmem(fpdata,...);     // call allocate memory function
stored(fpdata,...);     // call function to store data
...
return 0;
} // main ()

// --------------stored() function---------------
void stored(float** fpreal,...) {

FILE *fp;                  // file pointer
float datavalue;           // variable to hold data values read
int row;
int column;

fp = fopen("c:/file.txt","r");

for(column = 0; column < 117; column++) {
  for(row = 0; row < 424; row++) {
    fscanf(fp, "%f,", &datavalue);
    fpdata[row][column] = datavalue;
  } // for
} // for  
fclose(fp);
} // stored()

// ----------allmem() function----------------
// function to allocate memory for two dimensional arrays
// I have hard coded the values of the array sizes in, but
// in my actual program they are calculated at run time based
// on the size of some input files and this is done in the 
// countnumber() function

void allmem(float** fpdata,...) {
int i = 0;
fpdata = (float**) malloc((424)*sizeof(float*));
fpdata2 = (float**) malloc((424)*sizeof(float*));
...
for (i = 0; i<424; i++) {
  fpdata[i] = (float*) malloc((117)*sizeof(float));
  fpdata2[i] = (float*) malloc((117)*sizeof(float));
} // for

} // allmem()

1 Ответ

6 голосов
/ 02 апреля 2011

fpdata передается по значению, а не по указателю или по ссылке. Это означает, что когда функция возвращается из allmem, fpdata по-прежнему указывает на то же, что и раньше, и выделенная память теряется.

Вы хотите позвонить allmem(&fpdata,...);

И использовать функцию подписи void allmem(float*** fpdata,...)

Затем в allmem установите *fpdata = (float**)...

И, конечно же, (*fpdata)[i] = (float*) malloc... внутри цикла for.

Edit:

Полагаю, вы сделали бы то же самое для fpdata2. Но вам не нужно ничего менять в stored() (хотя, похоже, вы передаете fpreal , но присваиваете значения fpdata , что, вероятно, является просто ошибкой кода?). Указатели, переданные в stored, должны быть действительными, как они есть. Вы не пытаетесь изменить указатель в stored, просто значения в памяти, на которую он указывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...