Почему malloc терпит неудачу? - PullRequest
       0

Почему malloc терпит неудачу?

1 голос
/ 23 сентября 2010

Указатель на ожидаемую ошибку возникает, когда компилятор попадает в присваивание в конце функции.Почему?

(Удалены преобразования и записи индекса из кода; они были там для «отладки» покупки, очевидно, загромождали мой вопрос.)

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;
}

Ответы [ 3 ]

5 голосов
/ 23 сентября 2010

int ***array - указатель на указатель на указатель на int.

(*array) - указатель на указатель на int.

(*array)[sourceTermIndex] - указатель на int.

(*array)[sourceTermIndex][driveCurrentIndex] является целым.

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

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

У вас также есть приведение malloc к int:

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

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

2 голосов
/ 23 сентября 2010

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

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

1 голос
/ 23 сентября 2010
(*array)[][][] = ...

имеет слишком много уровней защиты для

int ***array

Если вам нужен указатель на двумерный массив, вам нужно

(*array)[][] = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...