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;

MSG_T:

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

MAX_SEND_SIZE = 4096、値は「」(\ 0または空のチェーン)とサイズ= 4096を含む(void *)char *文字列であるため、メモリ障害が発生する理由がわかりません。メモリが重複していないことを確認しています。これは実行の出力です:

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 に答える