2012-04-05 2 views
0

У меня проблемы с c и указатели. Я продолжаю размалывать это, и это должно быть легко. У меня есть структура, и я выделяю одну функцию, а затем возвращаю указатель обратно к исходной функции. Но когда я пытаюсь заполнить значения структуры другими переменными, а затем распечатать их или скопировать, приложение segfaults говорит, что адрес памяти выходит за пределы.c malloc в других функциях и структурах

struct memcache_buffer{ 
     int elements, action; 
     char keys[MAX_KEYS], values[MAX_KEYS], returns[MAX_KEYS]; //action 0 = delete , 1 = get 2 = set 
}memcache_buffer; 

struct memcache_buffer* memcache_allocate_buffer(int size){ 
     struct memcache_buffer *buffer; 
     buffer =malloc(sizeof(struct memcache_buffer)); 
     return buffer; 
} 

void memcache_set(char * key, char * value){ 
     pthread_t process_t; 
     struct memcache_buffer *buffer=memcache_allocate_buffer(1); 
     char keys,values; 
     buffer->elements = 1; 
     buffer->action=2; 
     //printf("crash?\n"); 
     printf("%s %s",key,value); 
     snprintf(buffer->keys[0],KEY_SIZE,"%s",key); 
     snprintf(buffer->values[0],VALUE_SIZE,"%s",value); 
     pthread_create(&process_t,NULL,memcache_process,buffer); 
} 

Я правильно распределяю память? выделение памяти, и эти указатели обязательно грубые, особенно в прошлом.

+0

Можем ли мы увидеть код, пожалуйста, – Mark

+0

Вы использовали 'valgrind' для отладки утечек памяти? Вы скомпилировали все предупреждения? В какой книге вы читали о программировании на С? Ваш pastebin не является полным кодом, поэтому мы не можем помочь. (Правильны ли «ключ» и «значение»?) –

+0

На какой ложь вы видите segfault? –

ответ

4

Вот ваша проблема:

struct memcache_buffer{ 
    char keys[MAX_KEYS], values[MAX_KEYS] 
} 

snprintf(buffer->keys[0],KEY_SIZE,"%s",key); 
        ^^^ 
snprintf(buffer->values[0],VALUE_SIZE,"%s",value); 
         ^^^ 

уронить [0] или snprintf попытается разыменовать какой фальшивой ценности.

+0

Компилятор должен был предупредить вас, если вы включите все предупреждения и использовать достаточно хороший компилятор (GCC, Clang, ...) –

+0

@BasileStarynkevitch В моих мнениях компиляторы должны иметь предупреждения для этого материала, включенные по умолчанию. – cnicutar

+0

Согласовано, но некоторые компиляторы этого не делают, и некоторые новички не спрашивают обо всех предупреждениях или игнорируют их. –

Смежные вопросы