【问题标题】:Segmentation Fault When Assigning Values to dynamic two dimensional array in C将值分配给C中的动态二维数组时出现分段错误
【发布时间】:2011-07-28 02:00:58
【问题描述】:

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

我正在使用 gcc 编译,编译时没有任何警告或错误。

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

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

【问题讨论】:

  • 您是否正在检查以确保您对malloc 的所有调用都成功返回?
  • 你说得对,我很抱歉。我删除了我的答案。
  • 是的,我检查了没有返回空指针,我没有内存不足,我想我只是以某种方式写入分配的内存位置,但我不知道如何这发生了。
  • 谢谢你的帮助 karlphillip

标签: c memory dynamic segmentation-fault


【解决方案1】:

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

你会想打电话给allmem(&amp;fpdata,...);

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

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

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

编辑:

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

【讨论】:

  • 您好,谢谢 JCooper,但是在添加您的建议后,我仍然遇到分段错误,并且在发生分段错误之前仅写入了几个数据位置时发生了同样的事情。也许您可以更明确地说明我需要进行的所有更改,以便我可以验证我确实进行了所有必要的更改。谢谢
  • 嗨 JCooper,我想我还需要执行 (*fpreal)[row][columns] = datavalue 才能写入我的数组。我以为我将数组声明为双指针,所以实际上我只有一堆双指针,所以我应该能够传递 fpdata,因为它已经是一个指针?
  • 您已经声明了一个名为 fpdata 的双指针。它最初指向垃圾。您将垃圾的 传递给 allmem。 allmem 创建了一个新变量来保存该垃圾。然后将新变量中的值设置为指向某个内存的指针。当函数返回时,新创建的变量从堆栈中被扔掉,所有分配的内存都丢失了。
  • 谢谢 JCooper,你真的为我节省了很多时间。我还想知道是否有更好的方法让我在 C 中动态分配二维数组,而不是我选择的方式,而且,选择使用这种方式将它传递给一堆不同的函数是一种好方法吗?
  • 在 C 中,用一个宽度高度长的 malloc() 分配一个长的内存块似乎是传统的做法。然后,您只需将其寻址为数组 [行 宽度 + 列]。通常,如果它们将具有不同宽度的行或者它们将被交换很多,则只会像您所做的那样分配指针的指针。
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 2010-12-27
  • 2016-10-04
  • 1970-01-01
  • 2021-03-25
  • 2021-08-04
  • 1970-01-01
  • 2018-06-16
相关资源
最近更新 更多