Получил ошибку seg от моего memcpy, что gdb не может дать мне что-нибудь еще (по крайней мере, за пределами простой манеры, что я знаю, как использовать gdb ...). Эта вещь глубоко внедрена в некоторый код с использованием Berkely DB; Я вынул единственные строки, которые должны быть полезны.memcpy Seg fault, казалось бы, невинно
void *databuf;
int smallest;
databuf=malloc(2*sizeof(int));
memset(databuf,0,2*sizeof(int));
/* This next line comes from the DB structures; key.data is a void*... */
smallest=*(int *)key.data;
memcpy(databuf,(void *)smallest,sizeof(int));
Чтобы подтвердить переменная Наименьший правильно, я могу отлаживать и получить
(gdb) print smallest
$1 = 120321
ошибка я получаю (в БГД) является бесполезным
Program received signal SIGSEGV, Segmentation fault.
0x08048efa in main (argc=4, argv=0xbffff344) at index_DB-1.1.c:128
128 memcpy(databuf,(void *)smallest,sizeof(int));
(gdb) backtrace
#0 0x08048efa in main (argc=4, argv=0xbffff344) at index_DB-1.1.c:128
Причина Я делать это в основном потому, что я учусь в учебнике DB Berkley, но и позже хочу сделать
memcpy(databuf+len,(void *)largest,sizeof(int));
У i.e есть указатель на указатель пустоты с первым байтом наименьшее целое число, а второй - наибольшее целое число. Что мне не хватает?
Тот факт, что вы считаете сообщение об ошибке «бесполезным», является большим ключом к тому, что вам не хватает. Другими словами, вы «пропустили» информацию, фактически предоставленную вам сообщением об ошибке. :) – unwind
ха-ха, я думаю о слове «бесполезно» в разговорной речи. Я знаю, что seg-ошибка, вероятно, означает какую-то недействительную запись в памяти, которая является полезной информацией ... но * больше * полезной информации будет «(void *) наименьший не является допустимым указателем, вы идиот!» – levitopher