2012-06-19 4 views
0

Получил ошибку 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 есть указатель на указатель пустоты с первым байтом наименьшее целое число, а второй - наибольшее целое число. Что мне не хватает?

+0

Тот факт, что вы считаете сообщение об ошибке «бесполезным», является большим ключом к тому, что вам не хватает. Другими словами, вы «пропустили» информацию, фактически предоставленную вам сообщением об ошибке. :) – unwind

+0

ха-ха, я думаю о слове «бесполезно» в разговорной речи. Я знаю, что seg-ошибка, вероятно, означает какую-то недействительную запись в памяти, которая является полезной информацией ... но * больше * полезной информации будет «(void *) наименьший не является допустимым указателем, вы идиот!» – levitopher

ответ

4

На этом этапе вы интерпретируете значение в smallest как указатель:

memcpy(databuf,(void *)smallest,sizeof(int)); 

Поскольку это значение почти наверняка не действительный указатель, это вызывает у вас Segfault. Вместо этого, вы, вероятно, хотите:

memcpy(databuf, &smallest, sizeof smallest); 

Если вам нужно smallest по какой-то другой причине, хотя, вы можете просто скопировать непосредственно из key.data к в databuf:

memcpy(databuf, key.data, sizeof(int)); 
+0

Я ценю это, хотя это простой ответ.Я на самом деле думал, что кастинг (void *) скопирует значение в наименьшее значение в память, на которое указывает databuf. Показывает, что я не понимаю этих вещей, как я думал. Благодаря! – levitopher

2

Трудно сказать, что вы делаете, учитывая код настолько ужасно, но это выглядит очень подозрительно:

memcpy(databuf,(void *)smallest,sizeof(int)); 

Я считаю, что smallest содержит нормальные целочисленные данные, а не указатель на что-нибудь. Так почему вы разыгрываете это? Это ни на что не указывает.

Вы можете:

memcpy(databuf,(void *) &smallest,sizeof(int)); 

Кроме того, это подозреваемый:

smallest=*(int *)key.data; 

Гарантируется ли smallest быть целым выровнены?

4
(void *)smallest 

Это принимает целое значение самый маленький и обрабатывает его как указатель. Что вы намеревались сделать следующее:

(void *)&smallest