2014-12-12 3 views
3

У меня возникли проблемы с моей первой программой, использующей malloc. Моя проблема в том, что программа вылетает, когда выполняется строка free(). Я понятия не имею, почему это происходит и хотелось бы знать, как это предотвратить.free() на массив структур

#include <stdio.h> 
#include <stdlib.h> 

struct product{ 
    int cost; 

    char thing[20]; 
}; 


int main() 
{ 
    int amount; 
    scanf("%d", &amount); 
    getchar(); 
    struct product *products; 
    products = (struct product *) malloc(amount); 
    for (int i = 0; i < amount; i++) 
    { 
     printf("Thing of %d ", (i + 1)); 
     gets(products[i].thing); 
     printf("Cost of %d: ", (i + 1)); 
     scanf("%d", &products[i].cost); 
     getchar(); 
    } 
    free(products); 
    return 0; 
} 

ответ

7

Вы не выделяете достаточное количество памяти. Оно должно быть:

products = (struct product *) malloc(amount * sizeof(struct product)); 

(таНос литая оставили в от оригинального кода, я не вводя эти дебаты.)

+0

Должно [лучше] (http://stackoverflow.com/q/605845/296974) be 'products = malloc (amount * sizeof (struct product));'. Хорошей альтернативой может быть 'products = malloc (amount * sizeof (* products));'. – glglgl

+0

@glglgl Malloc casting - бесконечный аргумент здесь, на SO, поэтому я решил остаться в стороне и просто ответить на вопрос. –

1

На самом деле вы malloc(), amount памяти и использует amount * sizeof(struct product). Это может сработать нормально, но когда вы вызываете free(), он вызывает сбой, как вы писали в какую-то нераспределенную память, а free() пытается освободить память, которая на самом деле не выделена для вас.

products = malloc(amount * sizeof(struct product)); // No casting too 

Там нет необходимости бросать значение, возвращаемое malloc(), так как он получает отлит неявно из void* указателя на someOther*.

1

Кроме того, не выделяя достаточное количество памяти с помощью функции malloc(), функция gets() небезопасна, устарела и поэтому никогда не должна использоваться.

Если в любой используемой точке вводится больше символов, чем буфер доступен, вы получите неопределенное поведение. Замените его на fgets(), который позволяет указать размер буфера.

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