繁体   English   中英

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

[英]Segmentation Fault When Assigning Values to dynamic two dimensional array in C

嗨,我正在用C编写程序,但是在运行程序时遇到了段错误。

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

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

当我运行程序时,将存储3个数据值,然后进行段错误。 它应将数据存储在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()

fpdata是通过值而不是通过指针或引用来传递的。 这意味着,当函数从allmem返回时,fpdata仍指向之前执行的操作,并且分配的内存丢失。

您将要调用allmem(&fpdata,...);

并使用void allmem(float*** fpdata,...)的函数签名

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

当然, (*fpdata)[i] = (float*) malloc...在“ for”循环中。

编辑:

我希望您也可以对fpdata2做同样的事情。 但是您不必在stored()任何更改(尽管看起来像您传入了fpreal,但为fpdata分配了值,这可能只是简化的代码错误?)。 传递给stored的指针应该是正确的。 您并不是要更改stored的指针,只需更改它指向的内存中的值即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM