0

我在调用时面临“内存故障”:

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;

味精_T:

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

MAX_SEND_SIZE = 4096, value 是一个 (void *)char *string 包含 "" (\0 或空链) 和 size = 4096,所以我不明白为什么我会遇到内存错误。我检查没有内存重叠。这是执行的输出:

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

我还没有发现这里什么样的条件会导致分段,因为所有内存都已分配好,值为空字符串并且没有内存重叠。

我有时只会出现内存错误(它似乎是随机的),而其他时候进程会执行并退出而没有错误。

4

2 回答 2

5

memcpy(mymsg->mtext,值,大小);

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

于 2013-05-31T12:17:34.157 回答
0

您提到该值是包含“”的 (void *)char *string。但 memcpy 的大小参数是 4096,即问题。

于 2013-05-31T13:07:32.923 回答