2014-12-01 5 views
0

Мне нужно было реализовать конкретный ADT, strqueue, для моего класса CS сегодня, поэтому я написал две функции: create_StrQueue() и add_to_back (StrQueue sq, const char * str). К сожалению, когда я вызываю create_StrQueue в add_to_back, я получаю ошибку seg, и я не могу понять, почему именно. Вот код, который я написал для этих двух функций:Ошибка сегментации с помощью Malloc

[править] Я должен, вероятно, malloc tempWord в add_to_back.

#include <stdlib.h> 

// A strqueue is an ADT consisting of words 
struct strqueue{ 
    StrQueue back; // last StQueue in queue 
    StrQueue next; // next StrQueue in queue 

    char* word;  // stored string 
    int length;  // length of entire queue 
}; 

typedef struct strqueue* StrQueue; 

StrQueue create_StrQueue(void){ 

    StrQueue retq = malloc(sizeof(struct strqueue)); // get memory for a new strqueue 
    retq->word = malloc(sizeof(char*)); 
    retq->word = NULL; 
    retq->back = retq;  // set back pointer to itself 
    retq->next = NULL;  // nothing after this strqueue yet 

    return retq; 
} 

void add_to_back(StrQueue sq, const char* str){ 

    char* tempWord; 
    sq->length++; 

    for(int i=0; str[i]; ++i) tempWord[i]=str[i]; // copy string for the new strqueue 

    if(sq->word==NULL) sq->word = tempWord; // input strqueue was empty 

    // input StrQueue was not empty, so add a new StrQueue to the back 
    StrQueue new = create_StrQueue(); // results in seg fault 
    new->word = tempWord; 
    sq-back->next = new; // swaping pointers around to add malloced StrQueue to the back 
    sq->back = next; 
} 

Я в недоумении, и поэтому я надеюсь, что кто-то может уточнить, что именно происходит, потому что, когда я бегу основной, как это;

int main(void){ 

char* str1 = "Hello"; 

StrQueue sq = create_StrQueue(); // does not cause seg fault 
add_to_back(sq, str1); 
} 

вызов create_StrQueue() впервые работает нормально.

+0

1) 'tempWord [i] = str [i];' неверно. – BLUEPIXY

+0

How-so? Я запустил небольшой фрагмент кода, чтобы распечатать tempWord после этого цикла, чтобы убедиться, что он скопировал строку, и это действительно так. – Plopperzz

+0

1) Площадь для хранения не гарантируется. – BLUEPIXY

ответ

1

char* в struct является указателем на массив символов. retq->word = malloc(sizeof(char*)); - неправильный способ выделения строки; что это на самом деле делает это присваивает крошечный массив до word, по существу бесполезный, а затем вы перезаписываете то, что вы только что выделили, назначив NULL на word, пропуская память. Вся память, выделенная malloc, должна быть впоследствии выпущена вручную с помощью free. Вы имеете дело с указателем. Присвоение данных ему не имеет магии, связанной с C, вы просто заменяете значение самого указателя.

В add_to_back, вам нужно выделить место для tempWord перед копированием данных в него:

tempWord = malloc(strlen(str)+1);

Вы добавляете 1 для размещения нулевого терминатора в строке. Используйте strcpy, чтобы скопировать в tempWord вместо того, чтобы писать свой собственный метод копирования строк, ваш метод не добавляет нулевой терминатор.

Еще лучше решить, что create_StrQueue принимает параметр const char* и выполняет распределение строк и копирование там.

Вы также должны избегать использования слова new, так как это выглядит немного запутанным для программиста на C++. :)

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