2015-03-05 2 views
0

У меня есть числа в связанном списке, который я должен преобразовать в char * и вернуться.связанный список встроен, но не работает должным образом

Здесь есть функция, в которой проблема, вероятно, существует.

char* int_str(struct Node** head,char* result) //head is pointer to singly linked list 
{ 
    struct Node* temp = *head; 
    char* string1=""; 
    char* str; 
    while(temp != NULL) 
    { 
    string1=myitoa(temp->data,string1); // myitoa() works fine 
    str=(char*)malloc(1+strlen(string1)); 
    strcpy(str,string1); 
    strcat(result,str); 
    temp=temp->next; 
    } 
    return result; 
} 

Последний вызов temp-> данных всегда заканчивается с неизвестными значениями мусора. (Связанный список построен правильно, как печать связанный список работает должным образом).

Пример: связанный список 1-> 2-> 3

Последний вызов TEMP-> данные в функции дает 50 (некоторые из мусора значение) т.е. 1-> 2-> 50

в то время как в основной функции список правильно дает 1-> 2-> 3

последняя переменная заканчивается как мусор в этой функции, но показывает правильно в основной функции, почему?

+3

string1 не инициализируется Как это должно работать? – chmike

+0

myitoa() возвращает char * каждый раз, когда он вызывается – solinvictus

+1

, у вас есть утечка памяти с помощью str. Вы не освобождаете выделенный блок.Почему не просто 'strcat (result, string1)' – chmike

ответ

1

Этот кусок кода, скорее всего, будет делать эту работу. Нет необходимости в malloc. str определяется как массив из 20 символов. Здесь хранится номер в ASCII.

char* int_str(struct Node** head,char* result) //head is pointer to singly linked list 
{ 
    struct Node* temp = *head; 
    char str[20]; 
    while(temp != NULL) 
    { 
     strcat(result, myitoa(temp->data, str)); 
     temp=temp->next; 
    } 
    return result; 
} 
+0

Спасибо, что я был наклонён на использование malloc, мое эго стало лучше меня. Вышеприведенный код, очевидно, будет работать отлично. Но как я могу заставить этот код работать? – solinvictus

+0

Первое изменение 'char * string1 =" ";' в 'char string1 [20];'. Во-вторых, добавьте 'free (str);' after 'temp = temp-> next;'. Это заставит ваш код работать. 'char string1 [20];' предоставляет хранилище, необходимое для myitoa(). – chmike

+0

Да, я забыл выделить память здесь. Почему работает объявление массива, а не char *. – solinvictus

2
char* string1; 

Это объявление указателя, но не выделяет буфер для строки. Немного запутанно, что этот неинициализированный указатель передается в myitoa, потому что myitoa ничего не может с этим сделать, не вызывая неопределенного поведения.

Эта строка всегда выделяет 5 байт на 32-битных системах:

str=(char*)malloc(1+sizeof(string1)); 

sizeof(string1) является размером указателя, а не строк. Используйте

str=(char*)malloc(1+strlen(string1)); 

вместо этого, или, еще лучше, используйте

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

потому что the result of malloc should not be casted.

+0

Я не понимаю, в чем проблема с string1 в myatoi(), я использовал заявления печати, и он отлично работает. Но спасибо, что ссылка узнала что-то новое сегодня :) – solinvictus

+0

Добро пожаловать :-). 'string1' указывает на случайный адрес, потому что нет инструкции, которая устанавливает указатель (' string1 = ..... '). Если этот случайный адрес читается или записывается, это просто удача, что программа не сбой. – alain

0

Я не думаю, что проблема заключается в манипуляциях с строкой. Скорее всего, это связано с созданием связанного списка. Попробуйте следующее:

Прежде всего, попробуйте напечатать значение temp-> данных в цикле. Возможно, это должен быть мусор (в этом случае создание списка содержит проблему). Если напечатанное значение верное, проверьте, возвращает ли возвращаемая строка «результат», имеет то же значение или нет. Если нет, то проблема в myitoa функция.

Здесь я предполагаю, что myitoa выделяет память string1. (Если нет, то вы должны выделить память для него либо перед передачей его функционировать или внутри myitoa.

+0

Из вопроса: Связанный список построен правильно, так как печать связанного списка работает правильно. – solinvictus

+0

Из ответа: Здесь я предполагаю, что myitoa выделяет память для строки1 (если нет, то вам нужно выделить ей некоторую память либо перед передачей ее функции, либо внутри myitoa). – coolVick