Почему ошибка сегментации? стрток и маллок
У меня есть следующий код, который отлично работает, когда не используется 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)) {
...