C语言 内存调用中出现内存故障



在调用

时遇到"内存错误"
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是指向struct的指针:

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,值是一个(void *)字符*字符串包含"(或空链)和大小= 4096,所以我不明白为什么我得到内存故障。我正在检查有没有内存重叠。这是执行的输出:

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

我没有找到什么样的条件在这里可以导致分割,因为所有的内存已经很好地分配,值是一个空字符串,没有内存重叠。

我只得到内存故障有时(它似乎是随机的)和其他时候的进程跟随执行和退出没有错误。

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

value是一个长度为0的字符串,您正试图从该字符串复制4096字节。因此,您正在访问4095未分配字节,这意味着您正在调用未定义的行为。

您提到value是一个包含"的(void *)char *字符串。但是memcpy的size参数是4096,这就是问题所在

最新更新