簡體   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