1

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

1 回答 1

8

[]*在 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.
于 2010-01-24T06:20:53.857 回答