2010-09-22 184 views
1

编译器在函数结尾处获得赋值时发生指针预期错误。为什么?为什么malloc失败?

(去掉石膏和代码索引符号;他们在那里的“调试”买显然堆满我的问题。)

int createArraySimple(int initialResetCount, int ***array) 
{ 
    int sourceTermIndex, driveCurrentIndex, preEmphasisIndex, freqIndex, voltageIndex, slicerIndex, biasIndex; 
    int dataIndex, dataCount = 3; 

    *array = malloc(2*sizeof(int**));          // sourceTerm 
    if (*array == NULL) 
     return 0; 
    for (sourceTermIndex=0; sourceTermIndex < 2; sourceTermIndex++)     
    { 
     *((*array)+sourceTermIndex) = malloc(2*sizeof(int*));       // drive current 
     if (*((*array)+sourceTermIndex) == NULL) 
      return 0; 
     for (driveCurrentIndex=0; driveCurrentIndex < 2; driveCurrentIndex++) 
     { 
      *((*((*array)+sourceTermIndex))+driveCurrentIndex = malloc(2*sizeof(int)); // pre-emphasis 
      if (*((*((*array)+sourceTermIndex))+driveCurrentIndex) == NULL) 
       return 0; 
     } 
    } 

    //'initialize elements in array, since if they are not updated, we won't print them 
    for (sourceTermIndex = 0; sourceTermIndex < 2; sourceTermIndex++) 
     for (driveCurrentIndex = 0; driveCurrentIndex < 2; driveCurrentIndex++) 
      for (preEmphasisIndex = 0; preEmphasisIndex < 2; preEmphasisIndex++) 
       *((*((*((*array)+sourceTermIndex))+driveCurrentIndex))+preEmphasisIndex) = initialResetCount; 
         return 1; 
} 
+1

哇。它的代码就像这样可以让C#成为一个非常开心的地方。如果我不得不使用这个,我可能会使用一个缓冲区分配,并完成数组[]自己的数学运算,以确保一切正确。 – 2010-09-22 20:29:04

+5

它是全明星! – nategoose 2010-09-22 20:40:48

+6

男人,只是不要发布'createArrayComplicated'。我认为我不能接受那个。 – 2010-09-22 20:45:45

回答

2

*array让你一个int** - 这相当于array[0]。所以(*array)[x]给你一个int*(*array)[x][y]给你一个普通的int。然后你尝试在这个int上使用数组索引操作符,编译器说:“哇,那不是指针!”

我想你的意思只是写array而不是*array

1
(*array)[][][] = ... 

有一个

int ***array 

反引用的层次太多。如果你想有一个指针指向一个二维数组,你需要

(*array)[][] = ... 
5

int ***array是一个指针,指针指向int的指针。

(*array)是指向int的指针。

(*array)[sourceTermIndex]是一个指向int的指针。

(*array)[sourceTermIndex][driveCurrentIndex]是一个int。

(*array)[sourceTermIndex][driveCurrentIndex][preEmphasisIndex]是取消引用一个int,这是不可能的,因此错误消息。

这两个数组都是一个in参数,它不应该被赋值,或者你希望它是一个out参数,它是一个指向指向int的指针的指针,所以使它成为一个四星指针。

你也有一个malloc的铸造为int:

(int)malloc(2*sizeof(int)); // pre-emphasis 

不要做,它只是隐藏错误的左手应该是一个指针。早期的错误更好; malloc的结果非常罕见需要被转换。