C многомерные массивы, несовместимое назначение

#c #multidimensional-array

#c #многомерный массив

Вопрос:

Очень специфическая проблема, возможно, из-за моего в целом плохого понимания многомерных массивов в C. У меня есть этот код:

 int io_pipes[NUM_IO_PROC][n][2][2];

for (int i = 0; i < n;   i) {
    int pipes[NUM_IO_PROC][2][2];
    for (int j = 0; j < NUM_IO_PROC;   j) pipes[j] = io_pipes[j][i];
}
  

Конечно, чего-то не хватает (например, того, что происходит с pipes переменной). Проблема в том, что в строке 5 я получаю ошибку компилятора с надписью «несовместимый тип в присваивании». Мне бы хотелось, чтобы компилятор предоставил мне больше информации, потому что, насколько я знаю, pipes[j] и io_pipes[j][i] оба типа int[2][2] .

Комментарии:

1. Вы хотите скопировать данные или просто «создать указатели»?

2. Я думаю более правильно pipes[j] и io_pipes[j][i] оба типа const int[2][2] , что означает, что вы не можете назначить pipes[j] .

3. Я выбрал версию struct, которая позволяет мне делать именно то, что я хотел, а не версию memcpy, приведенную ниже, и в целом имеет больший смысл.

Ответ №1:

Вы не можете «назначать» массивы. (По крайней мере, то, что я думаю, что вы пытаетесь сделать.)

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

 for(int j = 0; j < NUM_IO_PROC;   j)
    memcpy(amp;pipes[j], amp;io_pipes[j][i], sizeof pipes[j]);
  

Комментарии:

1. memcpy(amp;pipes[j], amp;io_pipes[j][i], sizeof pipes[j]); вероятно, понятнее.

Ответ №2:

Идентификатор массивов внутренне обрабатывается как указатель на базовый адрес, но, в отличие от указателей, им нельзя присвоить новое значение адреса, которое вы пытаетесь выполнить в pipes[j] = io_pipes[j][i];