在C中为动态二维数组赋值时出现分段错误

在C中为动态二维数组赋值时出现分段错误,c,memory,dynamic,segmentation-fault,C,Memory,Dynamic,Segmentation Fault,嗨,我正在用C写一个程序,但是我在运行我的程序时遇到了一个分段错误 我使用gcc进行编译,编译时没有给出警告或错误 我尝试使用gdb跟踪SEGFULT的原点,它将我引导到将数据值分配给二维数组的行: 数组[行][列]=数据值 当我运行我的程序存储3个数据值,然后seg故障。它应该在424行117列上存储数据,但在仅存储3个数据值后,它始终会隔离故障 我的代码如下(略去一些细节): #包括 #包括 #包括 void allmem(浮点**fpdata,…);//分配内存头 存储的无效数据(浮点**

嗨,我正在用C写一个程序,但是我在运行我的程序时遇到了一个分段错误

我使用gcc进行编译,编译时没有给出警告或错误

我尝试使用gdb跟踪SEGFULT的原点,它将我引导到将数据值分配给二维数组的行: 数组[行][列]=数据值

当我运行我的程序存储3个数据值,然后seg故障。它应该在424行117列上存储数据,但在仅存储3个数据值后,它始终会隔离故障

我的代码如下(略去一些细节):

#包括
#包括
#包括
void allmem(浮点**fpdata,…);//分配内存头
存储的无效数据(浮点**fpdata,…);//存储数据头
void countnumber(int*num1,int*num2,…);//计数头
int main()//main()函数
{
int numberofrows=424;//行数
浮点**fpdata;//浮点的二维数组fpdata
allmem(fpdata,…);//调用分配内存函数
存储(fpdata,…);//调用函数存储数据
...
返回0;
}//main()
//------存储()函数---------------
存储的无效(浮动**fpreal,…){
FILE*fp;//文件指针
float datavalue;//用于保存读取的数据值的变量
int行;
int列;
fp=fopen(“c:/file.txt”,“r”);
用于(列=0;列<117;列++){
用于(行=0;行<424;行++){
fscanf(fp、%f、&datavalue);
fpdata[行][列]=数据值;
}//为了
}//为了
fclose(fp);
}//存储()
//------------allmem()函数----------------
//函数为二维数组分配内存
//我已经硬编码了数组大小的值,但是
//在我的实际程序中,它们是基于运行时计算的
//关于一些输入文件的大小,这是在
//countnumber()函数
void allmem(浮动**fpdata,…){
int i=0;
fpdata=(浮动**)malloc((424)*sizeof(浮动*);
fpdata2=(浮动**)malloc((424)*sizeof(浮动*);
...
对于(i=0;ifpdata是通过值传递的,而不是通过指针或引用。这意味着当函数从allmem返回时,fpdata仍然指向它以前所做的事情,并且分配的内存丢失

您需要调用
allmem(&fpdata,…);

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

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

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

编辑:

我希望您对fpdata2也会这样做。但是您不必更改
存储()
中的任何内容(尽管看起来您传入了fpreal,但为fpdata赋值,这可能只是一个简化的代码错误?)。传递给
存储的
的指针应该是有效的。您没有试图更改
存储的
中的指针,只更改它指向的内存中的值。

fpdata是按值传递的,而不是按指针或引用传递的。这意味着当函数从allmem返回时,fpdata仍然指向相同的对象它以前做过,分配的内存丢失

您需要调用
allmem(&fpdata,…);

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

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

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

编辑:


我希望您对fpdata2也会这样做。但是您不必更改
存储()
中的任何内容(尽管看起来您传入了fpreal,但为fpdata赋值,这可能只是一个简化的代码错误?)。传递到
存储的
的指针应该是有效的。您没有试图更改
存储的
中的指针,只是更改它指向的内存中的值。

您是否正在检查以确保所有对
malloc
的调用都成功返回?您是对的,我很抱歉。我删除了我的答案。是的,我检查了没有返回空指针,我没有耗尽内存,我想我只是在以某种方式写入分配的内存位置,但我不知道这是如何发生的。谢谢你的帮助Karlphillip你是否正在检查以确保所有对
malloc
的调用都成功返回?你是对的,我的ap逻辑。我删除了我的答案。是的,我检查了没有返回空指针,我没有耗尽内存,我想我只是在以某种方式向分配的内存位置写入,但我不知道这是如何发生的。谢谢你的帮助karlphillipHi,谢谢你JCooper,但是我仍然遇到了分段错误ter加入您的建议后,同样的事情也发生了,在它发生seg故障之前,只写入了几个数据位置。也许您可以更明确地说明我需要做的所有更改,这样我就可以验证我是否做了所有必要的更改。谢谢您Hi JCooper,我想我还需要做(*fpreal)[行][列]=数据值,以便写入我的数组。我以为我将数组声明为双指针,所以实际上我只有一堆双指针,因此我应该能够传递fpdata,因为它已经是指针了?您声明了一个名为
fpdata
的双指针。它最初指向垃圾。您将垃圾的值传递给了
allmem
。allmem创建了一个新变量来保存垃圾。然后您将该新变量中的值设置为指向某个内存的指针。当函数返回时,新创建的变量从堆栈中抛出,所有分配的内存都丢失了。谢谢JCooper,您真的为我节省了这么多时间。我还想知道对于我来说,这里有一个更好的方法来动态分配一个t
#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()