Присвоение части 2d массива 1d массиву - PullRequest
0 голосов
/ 04 октября 2011

Как мне сделать следующее:

int A[2][2];
int B[2];
A[1][0]=2;
B=A[1];
printf("%d",B[0]); //prints out 2

я должен использовать malloc?Я знаю, что в языках более высокого уровня работает вышеуказанный метод, но я немного запутался в том, что делать в C

Ответы [ 4 ]

1 голос
/ 04 октября 2011

Вы не можете назначить массивы (хотя вы можете инициализировать их, что очень отличается).

Вы можете делать то, что хотите, назначив B поэлементно

B[0] = A[1][0];
B[1] = A[1][1];

или, с петлей

for (k=0; k<2; k++) B[k] = A[1][k];
1 голос
/ 04 октября 2011

Вы могли бы вы memcpy ().

#include <stdio.h>
#include <string.h>

int main() {
  int a[2][2] = {{1, 2}, {3, 4}};
  int b[2];

  // Syntax: memcpy(to, from, number_of_bytes_to_copy);
  // (to and from should be pointers)
  memcpy(b, a[1], sizeof(int) * 2);

  printf("%d %d", b[0], b[1]);
}

Выход:

3 4
1 голос
/ 04 октября 2011

Проблема здесь в том, что переменная объявляется как int B, когда вы должны объявить ее как int B[2].

В вашем коде, когда вы присваиваете A[1] для B, она присваиваетзначение первого элемента от A[1] до B

Вы можете объявить как int *B, поэтому вам будет присвоено значение A[1] для B.Как это, в зависимости от компилятора не будет компилироваться.Чтобы проверить, выполните:

int *B;
B = A[1];
printf("%d, %d", B[0], B[1]);
0 голосов
/ 04 октября 2011

Массивы не назначаются.Вы не можете назначить весь массив.Будь то 2D, 1D или 42D, здесь не имеет никакого значения.

Используйте memcpy

static_assert(sizeof B == sizeof A[1]);
memcpy(B, A[1], sizeof B);

напишите свою собственную функцию копирования массива или используйте макрос

#define ARR_COPY(d, s, n) do{\
    size_t i_, n_; for (i_ = 0, n_ = (n); i_ < n_; ++i_) (d)[i_] = (s)[i_];\
  }while(0)

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