Я пытаюсь добавить новый узел в структуру с полем char* (word)
Определение listT:
enum boolean {false, true};
struct list {
enum boolean sorted;
union{
int words;
char *word;
};
struct list* next;
struct list* previous;
};
typedef struct list listT;
Функция add_word_node вызывается main как: add_word_node(read_word, list_head)
где read_word
задается пользователем с помощью scanf. Word передается как строка, но после strncpy нет завершающего байта.
>Debugger:
add_word_node (word=0xbffff0fa "ally", head=0x804c038) at prog.c
>Debugger:
(gdb) p newnode->word
$2 = 0x804c068 "allyP\224\373\267\377\377\377\377"
listT *add_word_node(char word[], listT *head) {
listT *newnode;
listT *curr = NULL;//sorted
//listT *prev;//sorted
newnode = malloc(sizeof(listT)); /* allocate new node and check */
newnode->word = malloc(sizeof(char)* WORDLEN);
strncpy(newnode->word, word, strlen(word));
//newnode->word = strndup(word, strlen(word));
if (newnode == NULL) {
return (NULL);
}
if (head->sorted == false){ //eisagwgh sto telos ths listas
newnode->next = head;
head->previous->next = newnode;
newnode->previous = head->previous;
head->previous = newnode;
}else {
if(head->next == head){
newnode->next = head;
newnode->previous = head;
head->next = newnode;
head->previous = newnode;
}else{
for (curr = head->next; curr->next != NULL; curr = curr->next){//for( curr = head->next; ;){
if(curr == NULL) break;
if(strncmp(curr->word,newnode->word,strlen(word)) > 0) break;
//else curr= curr->next;
}
if(strncmp(curr->word,newnode->word,strlen(word))== 0){
return(curr);
}
newnode->next = curr;
newnode->previous = curr->previous;
newnode->previous->next = newnode;
newnode->next->previous = newnode;
}
}
return (newnode);
}
Я прочитал некоторые другие темы об этой проблеме и изменил функцию, чтобы использовать слово [] вместо char *, но она все еще не работает. Пожалуйста, сообщите мне, если вам нужна дополнительная информация. Кроме того, когда я использую strndup, иногда он работает без ошибок.
curr = head->next
этот head-›next не равен NULL? Потому что в этом случае curr-›word точно выдаст ошибку seg.. Да, в этом проблема. - person Igor   schedule 27.12.2014for
я бы проверил действительностьcurr
, а не просто переназначил бы его вelse
:for (cur = head->next; curr->next; curr = curr->next)
было бы немного безопаснее - person Elias Van Ootegem   schedule 27.12.2014for (curr = head->next; curr->next != NULL; curr = curr->next) if(curr == NULL) break; if(strncmp(curr->word,newnode->word,strlen(word)) > 0) break;
- person user3163175   schedule 27.12.2014listT
- person chux - Reinstate Monica   schedule 27.12.2014strncpy(newnode->word, word, strlen(word)+1);
неправильно. - person wildplasser   schedule 27.12.2014add_word_node
никогда не вызывается, поэтому в этой программе ничего не может произойти. Кроме того, структураlistT
не определена, поэтому этот код даже не компилируется. - person barak manos   schedule 27.12.2014strcpy(newnode->word, word);
, и не предлагает дополнительной защиты (strncpy никогда этого не делает). Также отсутствует определение для вашей структурыList
. (является ли newnode-›word указателем или массивом? Это может быть даже массив переменной длины) - person wildplasser   schedule 27.12.2014