【问题标题】:Pass by reference 2D dynamically allocated double array in C在C中通过引用传递二维动态分配的双数组
【发布时间】:2011-01-08 17:27:05
【问题描述】:

我正在尝试将我的字符串转换为双精度的动态数组。我的字符串的每个空格代表一列,每个“;”代表一个新行。此代码运行时,仅适用于 *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

【问题讨论】:

  • 你为什么不发布完整的代码?我们找不到您的行和列的定义。它们是全局变量吗?也许问题是您在 main 和 FParser 之间共享行/列。
  • 你能修复你的代码清单吗,我认为它缺少声明和右括号,很难阅读。

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


【解决方案1】:

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

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

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

其他杂项建议:

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

【讨论】:

  • 有效! Jamesdlin,感谢您的回复和建议。
  • 事实上,char string[256] 参数 is 类型为 char *(例如,sizeof string 不会计算为 256)。
猜你喜欢
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2020-06-29
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多