2015-10-11 4 views
0

Основываясь на моем нынешнем понимании, это связано с неправильным распределением памяти.Ошибка сегментации 11 При вызове члена Struct

Не понимаю, почему он может печатать элемент-> ключ и не вызывать функцию сравнения? Элемент struct item * уже находится в памяти, я думаю?

Любые советы? были застряли довольно долго

struct item 
{ 
    char* key; 
    struct item *left; 
    struct item *right; 
}; 


int compare(char* A, char* B){ 
    return strcmp(A, B); 
} 

struct item* insert(struct item* item, char* key) 
{ 
    printf ("(%s):",key); 

    printf ("(%s)\n",item->key); // I can do Node->Key here 

    compare(item->key, key); // I cant do node->key here // Segmentation Error 
} 

Потенциальное исправление? Я попытался выделить его в память и загрузить элемент в него. Все тот же результат тоже. Просто пытаюсь что-нибудь я могу найти :(

struct item* item = (struct item*) malloc(sizeof(struct item)); 
+1

Вам не кажется, что объявление 'struct item' может быть нам полезно? –

+1

@MikeNakis Нет, это совершенно неуместно. ;-) –

+0

Хорошо, @FlyingAtom, пожалуйста, не стесняйтесь: можете ли вы привести нам пример того, что 'printf (" (% s) \ n ", item-> key);' печатает прямо перед 'compare()' аварии? –

ответ

1

После вашего разъяснения о том, что печатается, то Единственное, что я могу предположить, что ваш компилятор троллинг вас, и не выдаёт ошибку сегментации на самом деле происходит в вашем вызове compare(item->key, key);, но в пределах strcmp().

printf() проверяет нулевых аргументов, поэтому если item->key имеет значение null, то printf() напечатает "null". С другой стороны, strcmp() не проверяет на null, и он сработает, если вы пройдете null. Авария на compare() просто не имеет никакого смысла.

Конечно, следует отметить, что компиляторы не знают, что троллируют люди. Должно быть лучшее объяснение.

+0

Ahh, так что вы говорите, если я ставлю null в strcmp, я получаю ошибку сегментации? – CodeGuru

+0

Да. При передаче null в 'compare()' должно быть отлично. –

+0

Вы действительно эксперт! Спасибо :) – CodeGuru

1

Ты инициализировать item, но вы не назначал item->key должным образом. item->key все еще указывает куда-то неинициализированного.

+1

Извините, новичок здесь, если печать может получить к нему доступ, почему моя функция не может работать так же? : O – CodeGuru

+0

Это неопределенное поведение. «Печать может получить к нему доступ» не гарантирует, что «ваша функция может сделать то же самое». На самом деле не гарантируется, что «печать может получить к нему доступ». – timrau

+0

Чтобы получить исчерпывающий ответ, вы должны указать определение своей 'struct item'. @ ответ Timrau дает вероятные предположения о том, почему вы получаете ошибку seg, но мы не знаем, сохраняются ли эти предположения, не зная, что такое поля структуры. – fvgs