У меня основной вопрос о memcpy ():

У меня есть структура, членами которой являются несколько массивов.
Я хотел скопировать данные в структуре в буферную память (выделенную через malloc ())

Я вижу в этом ошибку сегментации. Я что-то не так делаю в этой реализации?

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

#define MAX 10

struct temp {
    int en;
    int one[MAX];
    int two[MAX];
 };

int main()
{
    struct temp *cpy;
    int *buffer, i;

    for(i=0; i<MAX; i++) {
            cpy->one[i] = i;
            cpy->two[i] = i * i;
     }

   buffer = malloc(3 * MAX * sizeof(int));
   memcpy(buffer, cpy, sizeof(struct temp));
}

Как скопировать полные данные в буфер?

2
Matrix 7 Ноя 2014 в 06:18

4 ответа

Лучший ответ

cpy - это просто неинициализированный указатель (ссылка) на память. Вам нужно будет инициализировать его, указав на выделенную память перед циклом for.

8
sherb 7 Ноя 2014 в 03:23

Вы никогда не выделяли место для cpy, на которое он мог указывать; фактически, вы никогда не присваивали значение cpy.

8
Scott Hunter 7 Ноя 2014 в 03:20

Во-первых, вы должны выделить место для cpy. В вашем коде это просто указатель, нигде не указывающий (что приводит к тому, что поведение undefined пытается его использовать):

cpy = malloc( sizeof *cpy );

После этого вы можете попробовать это:

buffer = malloc( sizeof *cpy );
memcpy(buffer, cpy, sizeof *cpy );

Однако есть возможная проблема с этим кодом. Структура может содержать отступы. (Обычно это не так, но это возможно). Если есть заполнение, тогда в вашем буфере будет какой-то мусор между реальными значениями.

Чтобы проверить отсутствие отступов, вы можете включить:

STATIC_ASSERT( sizeof *cpy == sizeof *buffer * (2 * MAX + 1) );

Тогда ваш код не скомпилируется, если есть отступы, и вам придется копировать каждый член индивидуально (что было бы моим предпочтительным решением в первую очередь):

buffer[0] = cpy->en;
memcpy( &buffer[1], cpy->one, MAX * sizeof *buffer );
memcpy( &buffer[1+MAX], cpy->two, MAX * sizeof *buffer );
3
M.M 7 Ноя 2014 в 03:40

Просто добавив это, чтобы получить незаполненную структуру, вы также можете сделать

struct example {
    //...
}__attribute__((packed));

В системах x86.

0
user2624583 25 Май 2018 в 02:57