将值分配给C中的动态二维数组时的分段错误

时间:2011-04-02 01:03:51

标签: c memory dynamic segmentation-fault

您好我正在用C语言编写程序,但是在运行程序时遇到了分段错误。

我正在使用gcc进行编译,并且在编译时没有给出警告或错误。

我尝试使用gdb跟踪段错误的来源,它将我引导到我将数据值分配给二维数组的行: array [row] [column] = datavalue;

当我运行程序时,存储3个数据值然后出现seg错误。它应该将数据存储在424行乘117列,但是在仅存储3个数据值之后它始终存在错误。

我的代码如下(遗漏了一些细节):

#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 个答案:

答案 0 :(得分:6)

fpdata 是通过值而不是通过指针或引用传递的。这意味着当函数从allmem返回时,fpdata仍然指向它之前所做的事情并且分配的内存丢失。

您需要致电allmem(&fpdata,...);

使用void allmem(float*** fpdata,...)

的函数签名

然后,在 allmem 中,设置*fpdata = (float**)...

当然,'for'循环中的(*fpdata)[i] = (float*) malloc...

编辑:

我希望你对fpdata2做同样的事情。但你不应该在stored()中更改任何内容(虽然看起来你传入 fpreal 但是为 fpdata 分配值,这可能只是一个简化的代码错误?)。传递给stored的指针应该是有效的。你不是试图改变stored中的指针,只是指向它所指向的内存中的值。