Ver*_*ian 0 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()
Run Code Online (Sandbox Code Playgroud)
fpdata是通过值而不是通过指针或引用传递的.这意味着当函数从allmem返回时,fpdata仍然指向它之前所做的事情并且分配的内存丢失.
你想打电话 allmem(&fpdata,...);
并使用函数签名 void allmem(float*** fpdata,...)
然后,在allmem中,设置*fpdata = (float**)...
当然,(*fpdata)[i] = (float*) malloc...在'for'循环中.
编辑:
我希望你对fpdata2做同样的事情.但你不应该改变任何东西stored()(虽然它看起来像你传入fpreal但是为fpdata赋值,这可能只是一个简化的代码错误?).传递给的指针stored应该是有效的.你不是试图改变指针stored,只是指向它所指向的内存中的值.