2010-09-22 15 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# очень счастливым местом. Если бы мне пришлось использовать это, я бы, вероятно, использовал один буферный блок и сделал массив [] math самостоятельно, чтобы убедиться, что все сделано правильно. –

+5

ЭТО ПОЛНОСТЬЮ ЗВЕЗД! – nategoose

+6

Человек, просто не отправляйте 'createArrayComplicated'. Я не думаю, что смогу принять это. –

ответ

2

*array получает вас int** - это эквивалентно array[0]. Итак, (*array)[x] дает вам int* и (*array)[x][y] дает вам простой int. Затем вы пытаетесь использовать оператор индекса массива в этом int, и компилятор говорит: «Whoa, это не указатель!»

Я думаю, вы хотели просто написать array вместо *array.

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

имеет слишком много уровней derefence для

int ***array 

Если вы хотите указатель на 2d массив вам нужно

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

int ***array является указателем на указатель на указатель на Int ,

(*array) является указателем на указатель для int.

(*array)[sourceTermIndex] является указателем на int.

(*array)[sourceTermIndex][driveCurrentIndex] is int.

(*array)[sourceTermIndex][driveCurrentIndex][preEmphasisIndex] вызывает разыменование int, что невозможно, поэтому сообщение об ошибке.

Любой массив является параметром, который не должен быть назначен, или вы хотите, чтобы он был параметром out, который является указателем на указатель на указатель на int, поэтому сделайте его четырехзначным указателем.

Вы также литой из таНоса в целом:

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

Не делай этого, это будет просто скрыть ошибку, что левая рука должна бы быть указателем. Более ранние ошибки лучше; это очень редко, потому что результат malloc должен быть отлит.

Смежные вопросы