Почему ошибка сегментации? стрток и маллок

У меня есть следующий код, который отлично работает, когда не используется malloc, но когда я хочу добавить динамическое выделение памяти, он говорит об ошибке сегментации, хотя он компилируется без предупреждений или ошибок. Зачем?

заранее спасибо

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

#define MAXNUM 30
#define STR 200 
#define MAXLEN 40

struct human { //Va
    char name[MAXLEN];
    char surname[MAXLEN];   
    int age;
    float weight;
};

int main(int argc, char *argv[]) {  
    char *dlim= ",", *end = "\n", *stop = NULL;
    char *tok, *string;
    string = (char *)malloc(sizeof(char) * STR);
    int i = 0, j = 0;

    struct human man[MAXNUM];

    FILE *fin = fopen("data.txt", "r"); 

    if (string == NULL) {
        printf("Memory not allocated");
    }

    if (fin == NULL) {
        printf("Cannot open file\n");
        exit(0);
    }

    while (fgets(string, sizeof(string), fin)) {
        tok = strtok(string, dlim);
        strcpy(man[i].name, tok);

        tok = strtok(stop, dlim);
        strcpy(man[i].surname,tok);         

        tok = strtok(stop, dlim);
        man[i].age = atoi(tok);

        tok = strtok(stop, dlim);
        man[i].weight = atof(tok);

        i++;
    }
    fclose(fin);  
    free(string);

    j = i;
    i = 0;
    while (i < j) {
        printf("%s %s %d %f \n", man[i].name, man[i].surname, man[i].age, man[i].weight);   
        i++;
    }
    return 0;
}

1 ответ

Решение

Когда вы делаете string выделенный массив char, sizeof(string) больше не дает вам размер массива, он дает вам размер указателя. Поэтому вы должны изменить цикл, чтобы сказать fgets размер вашего массива:

while (fgets(string, STR, fin)) {
    ...

Или лучше, если вы перераспределите массив по размеру size:

while (fgets(string, size, fin)) {
    ...
Другие вопросы по тегам