Ошибка памяти в вызове memcpy

Я сталкиваюсь с "ошибкой памяти" при вызове:

extern void *memcpy (void *__restrict __dest,
         __const void *__restrict __src, size_t __n)
 __THROW __nonnull ((1, 2));

Это кусок кода:

    fprintf(stderr, "sysconfig line 440 \n");
fprintf(stderr, "Value size: %d ; Pointer mymsg: %p ; Pointer value: %p ; mymsg->mtext: %s ; value: %s ; size: %d ;   \n", strlen(value), mymsg, value, mymsg->mtext, value, size);
memcpy(mymsg->mtext, value, size);
fprintf(stderr, "sysconfig line 442 \n");

mymsg - это указатель на структуру:

MSG_T *mymsg;

MSG_T:

typedef struct msgInfo {
int cmd;
int arg1;
int arg2;
char    mtext[MAX_SEND_SIZE];
} MSG_T;

MAX_SEND_SIZE = 4096, value - это строка (void *)char *, содержащая "" (\0 или пустую цепочку) и size = 4096, поэтому я не понимаю, почему я получаю ошибку памяти. Я проверяю, нет ли наложения памяти. Это результат выполнения:

sysconfig line 440 
Value size: 0 ; Pointer mymsg: 0x7fd49ac4 ; Pointer value: 0x7fd4ab4c ; mymsg->mtext:      ; value:  ; size: 4096 ;   
Memory fault

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

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

2 ответа

Решение

memcpy(mymsg->mtext, value, size);

value это строка длины 0 и вы пытаетесь скопировать 4096 байты из этой строки. Вы поэтому получаете доступ 4095 нераспределенные байты, что означает, что вы вызываете неопределенное поведение.

Вы упомянули, что значение - это строка (void *)char *, содержащая "". но аргумент размера для memcpy - 4096, это проблема.

Другие вопросы по тегам