Вопрос об уравнивании массивов в C - PullRequest
1 голос
/ 21 сентября 2010

Предположим, у меня есть два массива int x и y, и оба имеют длину 3. x = {0,1,2}.

Есть ли один шаг, чтобы присвоить значения x y. Когда я делаю y = x и пытаюсь напечатать значения y,

код не компилируется.

Я не хочу испытывать трудности написания цикла for и писать y [i] = x [i]

Ответы [ 7 ]

11 голосов
/ 21 сентября 2010

Вы можете использовать memcpy или memmove:

memcpy(y, x, sizeof x);
3 голосов
/ 21 сентября 2010

Хотя вы не можете сделать это:

int x[ 3 ] = { 0, 1, 2 };  // an array of three items
int y[ 3 ];                // another array of three items

y = x;                     // compile error - y isn't a pointer that can be reassigned.

Вы можете сделать это:

int x[ 3 ] = { 0, 1, 2 };
int *y = x;   // a pointer to an array

Вы создаете y как указатель на массив x, а не копия x.Если вы измените значения x, эти изменения также появятся при ссылке на y.

3 голосов
/ 21 сентября 2010

Вам нужно зациклить.

Это по существу фиксированные указатели, поэтому вы не можете просто назначить один другому. Вы должны скопировать каждое значение.

редактировать

Вот почему я не рекомендую memcpy:

  1. Это не быстрее для любого маленького количество элементов; это будет вероятно будь медленнее.

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

  3. Так как это просто C, вы можете (обычно) безопасно memcpy элемент. Если бы это был C ++, вы бы хотели убедитесь, что конструктор копирования был вызывается. Это делает использование memcpy вредная привычка.

В прямом ответе Карлу:

  1. Да, memcpy может быть очень быстрым для большие массивы простых данных. Это не то, с чем мы имеем дело здесь, хотя.

  2. Я не беспокоюсь об ошибках в memcpy, но простота наличия ошибки в его использовании. Требуется количество байтов, но натуральная вещь будет количеством элементов. Цикл for будет использовать количество элементов. На многих платформах есть более безопасные версии что вывести размер буфера и предотвратить перезаписывает; Я бы порекомендовал один из тех, если возможно, когда memcpy хорошая идея.

  3. Если бы это был массив объектов C ++, такой как std::string, затем вместо memcpy вызова конструктора копирования будет ошибка в себе. Да, я понимаю, что Примером является C, а не C ++, но это не сделай это хорошей идеей.

1 голос
/ 21 сентября 2010

Сверните их в структуру (или объединение, в данном случае).

struct int3 {
    int A[3];
};

int3 x = {{ 0, 1, 2 }};
int3 y = x;

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

1 голос
/ 21 сентября 2010

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

0 голосов
/ 21 сентября 2010

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

0 голосов
/ 21 сентября 2010

Вам необходимо выполнить цикл или вызвать библиотечную функцию, которая сделает это за вас, например, memcpy / memmove.

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