Как назначить 1D массив в 2D массив? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть 1D массив A[3] и 2D массив B[4][3].Я хочу присвоить массив A[3] одной из строк массива B[4][3].Как это сделать правильно?

#include<stdio.h>

void main()
{
   int A[3]={1,2,3};
   int B[4][3]={0};
   int row_select=2;

   B[row_select][] = A;
}   

Но это назначение не работает.Я не хочу назначать элемент за элементом, используя цикл for.Я хочу сделать это в одном утверждении.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Не делайте этого: используйте memcpy

Существует способ выполнить назначение с помощью одного оператора, если вы готовы выполнить некоторые предварительные настройки длясделать ваш код неразборчивымВы можете использовать тот факт, что структуры могут (1) быть назначены друг другу за один шаг, и (2) содержать массивы фиксированного размера.Компилятор, вероятно, все равно будет запускать memcpy под колпаком, но это забавное упражнение в нелепости:

#include<stdio.h>

#define SZ 3 // this is just for convenience

// a pointer to an anonymous structure containing our array
typedef struct {
    int x[SZ];
} *pthrowaway;

int main(void)
{
    int A[SZ]={1,2,3};
    int B[4][SZ]={0};
    int row_select=2;

    pthrowaway a = (pthrowaway)&A;
    pthrowaway b = (pthrowaway)&B[row_select];

    *b = *a; // magic

    return 0;
}

Переменные a и b не нужны.Вы можете назначить массивы одним оператором:

*(pthrowaway)&B[row_select] = *(pthrowaway)&A;

Вот ссылка IDEOne, показывающая версию C99: https://ideone.com/IQ6ttg А вот обычная версия C: https://ideone.com/pH1hS2

0 голосов
/ 11 февраля 2019

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

memcpy(B[row_select], A, sizeof(A));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...