2016-02-03 2 views
0

Я продолжаю получать ошибку сегментации, и я знаю ее из указателя char. Но я не могу понять, почему?Seg Fault, указатели malloc char

Whiskey* createWhiskey(int a, double p, char* n){ 

    Whiskey* whiskey = malloc(sizeof(Whiskey)); 
    whiskey->age = a; 
    whiskey->proof = p; 
    whiskey->name = malloc((strlen(n)+1) * sizeof(char)); 
    strcpy(whiskey->name, n); 
    return whiskey; 
} 
int main(){ 

    Whiskey* burbon; 
    burbon = createWhiskey(12, 90.0, "MakersMark"); 

    free(burbon); 

    return 0; 
} 

В комментарии от Alex (смотри ниже) добавляется следующая информация:

typedef struct{ int age; double proof; char* name; }Whiskey; 
+2

вы можете показать нам 'определение структуры Whiskey'. – Haris

+1

Пожалуйста, обновите весь код –

+1

Предполагая, что структура данных является «очевидной», то, кроме того, что нет результатов проверки результатов malloc, она выглядит нормально. Вы пробовали отладчик или отпечатки, чтобы сузить место аварии? – John3136

ответ

1

Как обсуждалось в комментариях программа, показанная в порядке.

Однако вы должны добавить некоторые проверки, чтобы избежать проблем. Что-то вроде:

typedef struct{ int age; double proof; char* name; } Whiskey; 

Whiskey* createWhiskey(int a, double p, char* n){ 
    Whiskey* whiskey = malloc(sizeof(Whiskey)); 
    if (whiskey) 
    { 
     whiskey->age = a; 
     whiskey->proof = p; 
     if (strlen(n) > SOME_MAXIMUM) 
     { 
      free(whiskey); 
      printf("Some error... maybe\n"); 
      return NULL; 
     } 
     whiskey->name = malloc((strlen(n)+1) * sizeof(char)); 
     if (whiskey->name) 
     { 
      strcpy(whiskey->name, n); 
     } 
     else 
     { 
      free(whiskey); 
      printf("Some error... \n"); 
      return NULL; 
     } 
    } 
    return whiskey; 
} 

int main(){ 

    Whiskey* burbon; 
    burbon = createWhiskey(12, 90.0, "MakersMark"); 
    if (!burbon) 
    { 
     printf("Some error... \n"); 
    }  

    // code.... 

    if (burbon) 
    { 
     free(burbon->name); 
     free(burbon); 
    } 
    return 0; 
} 
1

Надеюсь, что определение вашей структуры виски прекрасное. Следующий код прекрасно работает для меня:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
typedef struct Whisk { 
     int age; 
     double proof; 
     char *name; 
} Whiskey; 
Whiskey* createWhiskey(int a, double p, char* n){ 

    Whiskey* whiskey = malloc(sizeof(Whiskey)); 
    whiskey->age = a; 
    whiskey->proof = p; 
    whiskey->name = malloc((strlen(n)+1) * sizeof(char)); 
    strcpy(whiskey->name, n); 
    return whiskey; 
} 

int main(){ 

    Whiskey* burbon; 
    burbon = createWhiskey(12, 90.0, "MakersMark"); 
    if (!burbon) 
    { 
     printf("Some error... \n"); 
    } 

    // code.... 

    if (burbon) 
    { 
     free(burbon->name); 
     free(burbon); 
    } 
    return 0; 
} 
0

следующий код

  1. чисто компилирует
  2. выполняет соответствующую проверку ошибок
  3. не сегментный ошибка при запуске
  4. выполняет требуемую функцию
  5. правильно очищает, передавая оба выделенных указателя памяти на free()
  6. использует значащие имена передаваемых параметров

код:

#include <string.h> // malloc() 
#include <stdlib.h> // exit(), EXIT_FAILURE 
#include <stdio.h> // perror() 

typedef struct 
{ 
    int age; 
    double proof; 
    char* name; 
} Whiskey; 

Whiskey* createWhiskey(int age, double proof, char* name) 
{ 

    Whiskey* whiskey = NULL; 
    if(NULL == (whiskey = malloc(sizeof(Whiskey)))) 
    { // then, malloc failed 
     perror("malloc for Whiskey failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, malloc successful 

    whiskey->age = age; 
    whiskey->proof = proof; 
    whiskey->name = NULL; 

    if(NULL == (whiskey->name = malloc(strlen(name)+1))) 
    { // then malloc failed 
     perror("malloc for name field failed"); 
     free(whiskey); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, malloc successful 

    strcpy(whiskey->name, name); 
    return whiskey; 
} // end function: createWhiskey 


int main(void) 
{ 

    Whiskey* burbon; 
    burbon = createWhiskey(12, 90.0, "MakersMark"); 

    free(burbon->name); 
    free(burbon); 

    return 0; 
} // end function: main