Возврат многомерного массива в c - PullRequest
0 голосов
/ 02 апреля 2011

У меня проблемы с возвратом многомерного массива.Я создаю массив в функции, а затем изменяю его в другой функции.В основной функции я хочу распечатать содержимое массива, как указано ниже, но я не получаю ничего для отображения в консоли

Есть предложения?Спасибо.

//Build the grid array given the number of rows, columns and levels
char ***buildGrid(int numRows, int numCols, int numLevels)
{
    char ***levels;
    levels = malloc(numLevels *sizeof(char *)); //Contains all levels

    int rowIndex, levelIndex;

    for (levelIndex = 0; levelIndex < numLevels; levelIndex++)
    {
        char **level = malloc(numRows * sizeof(char *)); //Contains all rows

        for(rowIndex = 0; rowIndex < numRows; rowIndex++)
        {
            level[rowIndex] = malloc(numCols * sizeof(char)); //Contains all columns
        }      

        levels[levelIndex] = level;
    }

    return levels;
}

void readGrid(char ***grid)
{
     grid = buildGrid(3,3,3);

     grid[0][0][0] = 'a';
}

int main (int argc, const char * argv[])
{
    char ***gridData;

    readGrid(gridData);

    printf("%c", gridData[0][0][0]); //This does not output anything

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 02 апреля 2011

Я думаю, вы должны сделать

readGrid( &gridData );

и

void readGrid(char**** grid)
{
     *grid = buildGrid(3,3,3);

     (*grid)[0][0][0] = 'a';
}

Это потому, что вы хотите изменить содержимое gridData.

Кроме того, определите ваш основной как int main(void)

2 голосов
/ 02 апреля 2011

В основном вы передаете указатель сетки по значению, а не по адресу. всякий раз, когда вы хотите изменить содержимое переменной, вы должны указать ее адрес, иначе будет изменена только ее копия, поэтому, когда вы захотите изменить char*** gridData; в другой функции, другая функция должна получить параметр типа char**** и вам следует позвонить по readGrid(&gridData) и т. Д.

0 голосов
/ 02 апреля 2011

В сетке main () необъявлено, поэтому ваш код даже не скомпилируется.Возможно, вы имели в виду gridData.

Но затем gridData неинициализируется и разыменование приводит к неопределенному поведению.

Более того, "void main ()" также является неопределенным поведением, поэтому не проверяет возвращаемое значениеmalloc () и разыменование его.

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