2015-05-04 1 views
0
 *MyFile.h* 

     typedef char* dado_t; 
     typedef struct elemento elemento; 
     typedef struct lista2 lista2; 

    *MyFile.c* 

    struct elemento{ 
     dado_t str; 
     elemento* ant; 
     elemento* prox; 
    }; 

    struct lista2{ 
     elemento* primeiro; 
     elemento* ultimo; 
     elemento* corrente; 
    }; 

    void_insert(lista2* l, dado_t d){ 
     elemento* novo = malloc(sizeof(elemento*)); 
     novo->str = malloc(strlen(d) * sizeof(char)); 
     novo->str = d; 
     l->corrente = novo; 
     l->primeiro = novo; 
     l->ultimo = novo; 
     novo->prox = NULL; 
     novo->ant = NULL; 

    } 

dado_t replace(lista2* l, dado_t d){ 
    dado_t retorno = malloc(strlen(corrente->str) * sizeof(dado_t)); 
    retorno = corrente->str; 

    corrente->str = realloc(corrente->str, strlen(d) * sizeof(char)); 
    l->corrente->str = d; 
    return retorno; 
} 

Почему я получаю эту ошибку? Поскольку myel->str является указателем, который был выделен malloc(). Почему ошибка? Я использую временный элемент * быть предотвращены, если ошибка происходит с перераспределить()Realloc Invalid Pointer. Отменено (ядро сбрасывается)

Наб:

+0

Вы установили 'myel-> str' в d после malloc – Dinesh

+0

@Dinesh Да, но ошибка происходит до того, как компилятор туда попадет ... = s – PlayHardGoPro

+0

Вы хотите поделиться немного больше своего кода, потому что вызов последовательность неясна. возможно - до realloc - просто напечатайте myel-> str и d - может дать некоторую подсказку – Dinesh

ответ

1

Тип dado_t является char *, который первоначально точки ничего (я имею в виду, не NULL, но некоторые случайные значения). Вы правильно выделить память для него в

novo->str = malloc(strlen(d) * sizeof(char)); 

, который имеет одну крошечную ошибку: в C строку длины d нужно один байт больше памяти для завершающего нуля. Таким образом, изменить это

novo->str = malloc(strlen(d)+1); 

двух нот здесь: sizeof(char) гарантированно будет 1 (я думаю, что в спецификациях, а затем снова, он не делает никакого вреда, а может быть, вы хотите, чтобы убедиться, что вы имеете право синтаксис при выделяя int или другие более крупные типы).
Во-вторых, большинство стандартных библиотек имеют функцию, которая выполняет именно это: strdup. Все, что вам нужно сделать, это называть его своим строковым адресом, он сам делает часть +1.

Однако, следующая строка является более серьезной ошибкой:

novo->str = d; 

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

В этом случае, вы хотите сохранить полную копии строки d от аргумента функции, так что вы будете использовать

strcpy (novo->str, d); 

Не забывайте, что этот указатель будет «потерян», если вам когда-либо освобождают структуру novo. «Утерянный» указатель - это блок памяти, который вы ранее назначили (в строке malloc), но больше не указана действительная переменная. Поэтому, освобождая списки elemento, позвоните по телефону free(xx->str).

Если вы убедитесь, что str элемент всегда набор для NULL как только вы создаете новую elemento структуру, можно смело назвать free для строки, даже если это может быть NULL; free может справиться с этим. Как бы то ни было, вы, кажется, всегда присваиваете значение, поэтому здесь дело не в этом, но, как правило, я уверен, что явное очищение вновь созданной структуры, например, с помощью memset (novo, 0, sizeof(elemento));.

2

С elemento* novo = malloc(sizeof(elemento*)); вы таНос только пространство для указателя, но затем рассматривать его как пространство для структуры. Это перезаписывает информацию о хранении в куче.

1

Peter Schneider справедливо указал, что elemento* novo = malloc(sizeof(elemento*)) выделяет достаточно места для указателя (потому что это то, что elemento* есть); В этой ситуации есть два общих идиомы, каждый из которых делает штраф здесь:

  • elemento* novo = malloc(sizeof(elemento))
  • elemento* novo = malloc(sizeof(*novo))

И, конечно, нужно принимать советы Jongware слишком!