在C中通过引用传递2D动态分配的双数组

时间:2010-01-24 05:56:57

标签: c multidimensional-array pass-by-reference dynamic-memory-allocation

我正在尝试将我的字符串转换为动态的双精度数组。我的字符串的每个空格代表一列,每个“;”代表一个新行。当此代码运行时,它仅适用于* F [0] [col]时。当它到达* F [1] [col]时,它给出了错误“CCode.exe中0x00e4483c处的未处理异常:0xC0000005:访问冲突读取位置0xcccccccc。”谁知道为什么?

void main(void) {  
    double **F = NULL;  
    F = malloc(row * sizeof (double *));  
    for (m=0; m < row;m++) {  
        F[m] = malloc(col * sizeof(double ));
    }  
    FParser(string, &F);
for (m=0;m<rowF;m++)
    free(F[m]);
free(F);
}

void FParser(char string[256], double ***F) {  
  while (dummyChar_ptr != NULL) {
    dummyChar_ptr = strtok(dummyChar_ptr," ");
    while ((dummyChar_ptr) != NULL) {
      *F[row][col] = atof(dummyChar_ptr);
      dummyChar_ptr = strtok(NULL," ");
      col++;
    }
    col=0;
    row++;
    strcpy(dummyChar,string);
    dummyChar_ptr = strtok(dummyChar,";");
    for (x=0;x<row;x++) 
      dummyChar_ptr = strtok(NULL,";");  

  }

//example String: 1 0.1 0 0; 0 1 0 0; 0 0 1 0.1; 0 0 0 0.1

1 个答案:

答案 0 :(得分:8)

[]的优先级高于C中的一元*,因此*F[row][col]实际上是*(F[row][col]),并且您正在索引到错误的内存位置。

尝试(*F)[row][col])

顺便说一句,FParser没有理由采取double***F已经是一个指针;通过那个。您需要使用额外级别的间接的唯一原因是,FParser需要修改main()的{​​{1}}指向的内容。

其他各种建议:

  • 检查F是否成功。
  • 避免使用全局变量。
  • 除非您检查源字符串不会溢出目标缓冲区,否则不要使用malloc
  • 函数参数strcpy实际上并不保证输入参数是256个(或更多)元素的数组,所以IMO有点无意义,也可能是char string[256]