2015-05-03 2 views
1

Это мой код:Как освободить указатель в структуре?

typedef struct bobTheBuilder{ 
    char *name; 
    int fix; 
    int max; 
}; 

int main(void){ 

    struct bobTheBuilder bob; 
    initBob(&bob); 
    del(&bob); 

    system("PAUSE"); 
    return (0); 
} 

void initBob(struct bobTheBuilder *currBob) 
{ 
    char *n="bob"; 
    currBob->name = (char*)malloc(sizeof(char)*strlen(n)); 
    strcpy((*currBob).name, n); 
    (*currBob).fix = 0; 
    (*currBob).max = 3; 
} 

void del(struct bobTheBuilder *currBob) 
{ 
    free(currBob->name); 
} 

Визуальные перерывы студии на free предложения.

Что мне делать? Является ли проблема с free или malloc?

+0

Предоставление функций для освобождения строки в «деструкторе» вашей структуры данных - это плохая идея: что, если кто-то инициализирует 'currBob-> name' строковым литералом или массивом стека' char'? См. [Здесь] (http://stackoverflow.com/questions/28896609/how-to-distinguish-between-strings-in-heap-or-literals) для аналогичного случая. – Mints97

+0

И используйте 'getch()' вместо 'system (" pause ")'. – usr2564301

+0

@ Jongware, почему? –

ответ

7

Линия

currBob->name = (char*)malloc(sizeof(char)*strlen(n)); 

неправильно, потому что

  1. Вы не включили пространство для NUL-терминатор.
  2. Вы should not cast the result of malloc(and family) в С.

Фикс проблемы с помощью

currBob->name = malloc(strlen(n) + 1); 

Если вы задаетесь вопросом, почему я удалил sizeof(char), это потому, что sizeof(char) является guarenteed быть 1. Таким образом, это не обязательно.


@EdHeal mentions in a comment, есть функция strdup(), которая делает malloc + strcpy. Это функция POSIX. Если он доступен, вы можете сократить

currBob->name = malloc(strlen(n) + 1); 
strcpy((*currBob).name, n); 

в

currBob->name = strdup(n); 

с помощью этой функции. Кроме того, обратите внимание, что

(*currBob).fix = 0; 
(*currBob).max = 3; 

эквивалентно

currBob -> fix = 0; 
currBob -> max = 3; 

в @Edhealmentions in another comment.

+0

спасибо !!! это очень помогло! –

+0

Также '(* currBob) .fix = 0;' может быть 'currBob-> fix = 0;' –

+0

Чтобы оставаться на стороне сохранения, можно было бы: 'currBob-> name = malloc ((strlen (n) + 1) * sizeof * (currBob-> name)); ' – alk