Присвойте Структуре A B, где элементы A являются подмножеством B - PullRequest
2 голосов
/ 08 ноября 2011

Как я понимаю, присвоение массивов - это операция копирования из памяти, будет ли это работать?

struct x{
    int i;
    int j;
} A[5];

struct y{
    int i;
    int j;
    struct y * next;
} B[5];

Тогда я могу сделать:

B[0] = A[0];

и ожидать, что i и j скопированы для индекса [0]?

РЕДАКТИРОВАТЬ: я действительно хочу знать, как сделать эту работу в C.

Ответы [ 4 ]

3 голосов
/ 08 ноября 2011

Мое предложение - вставить struct x в struct y, вот так:

struct x{
    int i;
    int j;
} A[5];

struct y{
    struct x x;
    struct y * next;
} B[5];

Таким образом, его легко назначить, и структура памяти первых sizeof(struct x) байтов обеих структур гарантированно будет одинаковой даже в C89.

Теперь вы можете сделать

B[0].x = A[0];

Поскольку struct x гарантированно появляется в первом байте struct y в памяти, вы все равно можете сделать

memcpy(&B[0], &A[0], sizeof A[0]);

Вы можете играть с этим макетом в http://codepad.org/2rCJA0cx

2 голосов
/ 08 ноября 2011

Нет, эта строка кода не будет компилироваться.

См. http://codepad.org/6g3c9Ctz

Вы можете использовать memcpy, чтобы заставить его работать. Смотри http://codepad.org/1I9Z3npC

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

struct x{
    int i;
    int j;
} A[5];

struct y{
    int i;
    int j;
    struct y * next;
} B[5];

int main() {
    A[0].i = 5;
    A[0].j = 7;
    memcpy(&B[0], &A[0], sizeof A[0]);
    printf("%d %d\n", B[0].i, B[0].j);
    return 0;
}
0 голосов
/ 08 ноября 2011

Вы можете использовать приведение:

(struct x)(B[0]) = A[0];
0 голосов
/ 08 ноября 2011

Нет, вы не можете, потому что struct x и struct y не являются совместимыми типами.

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