[英]Trying to use a double pointer struct to read a csv file and print off the entries but I'm getting "Invalid read of size 8" in C
Creating a C program to read a csv file into a double pointer struct but I'm getting a segmentation fault.创建 C 程序以将 csv 文件读入双指针结构,但出现分段错误。
This is the struct:这是结构:
typedef struct vehicle{
char *make;
char *model;
char *color;
char *license_plate;
int year;
}vehicle_t;
I'm using a single pointer and double pointer in this program to get a better understanding of using pointers:我在这个程序中使用了单指针和双指针来更好地理解使用指针:
vehicle_t *v = NULL;
vehicle_t **car;
car = calloc(1, sizeof(vehicle_t *));
int num_cars = 0;
while(!fgets(buffer, BUF_SIZE, fp)){
//car = calloc(1, sizeof(vehicle_t *));
*(car+num_cars) = calloc(1, sizeof(vehicle_t));
*((car)+num_cars) = read_csv(fp, v);
num_cars++;
//free(v->year);
free(v->make);
free(v->model);
free(v->color);
free(v->license_plate);
free(v);
}
Here is the function I created to read csv file and return that in car:这是我创建的 function 以读取 csv 文件并将其返回到汽车中:
vehicle_t *read_csv(FILE *fp, vehicle_t *v){
char buffer[BUF_SIZE] = {0};
v = calloc(1, sizeof(vehicle_t));
fgets(buffer, BUF_SIZE, fp);
char *tok = strtok(buffer, ",");
(v)->year = atoi(tok);
tok = strtok(NULL, ",");
(v)->make = calloc(strlen(tok)+1, sizeof(char));
tok = strtok(NULL, ",");
strcpy((v)->make, tok);
(v)->model = calloc(strlen(tok)+1, sizeof(char));
strcpy((v)->model, tok);
tok = strtok(NULL, ",");
(v)->color = calloc(strlen(tok)+1, sizeof(char));
strcpy((v)->color, tok);
tok = strtok(NULL, ",");
(v)->license_plate = calloc(strlen(tok)+1, sizeof(char));
strcpy((v)->license_plate, tok);
return v;
}
Valgrind is telling me that I'm getting an issue here when I try to print the vehicles from double pointer car: Valgrind 告诉我,当我尝试从双指针汽车打印车辆时,我遇到了一个问题:
for(int i= 0; i<=num_cars; i++){
printf("%d %s %s (%s) LIC:%s\n", ((*car)->year), ((*car)->make), ((*car)- >model), ((*car)->color), ((*car)->license_plate));
}
Valgrind error message: Valgrind 错误信息:
I finish off the code by freeing the car double pointer:我通过释放汽车双指针来完成代码:
for(int i= 0; i<=num_cars; i++){
//free((*car)->year);
free((*car)->make);
free((*car)->model);
free((*car)->color);
free((*car)->license_plate);
free(*car);
free(car);
}
Not sure as to why I'm getting the segmentation fault.不知道为什么我会遇到分段错误。 Thought I had a decent handle of pointer usage and appeared like allocated and deallocated memory correctly.
以为我对指针使用有一个不错的处理,并且看起来像正确分配和释放 memory。
At least these problems:至少有这些问题:
Wrong pointer错误的指针
(v)->make = calloc(strlen(tok)+1, sizeof(char));
tok = strtok(NULL, ","); // ????
strcpy((v)->make, tok);
Code is strange.代码很奇怪。 Why allocate to a string length and then change
tok
before copying?为什么要分配一个字符串长度,然后在复制之前更改
tok
?
I'd expect something more like我期待更多类似的东西
(v)->make = calloc(strlen(tok)+1, sizeof(char));
strcpy((v)->make, tok);
tok = strtok(NULL, ",");
Research strdup()
for alternative code.研究
strdup()
以获取替代代码。
Only 1 car, wrong fgets()
usage只有 1 辆车,错误的
fgets()
用法
Code only allocates for 1 car代码仅分配给 1 辆车
//vehicle_t **car;
//car = calloc(1, sizeof(vehicle_t *));
//int num_cars = 0;
//while(!fgets(buffer, BUF_SIZE, fp)){
// *(car+num_cars) = calloc(1, sizeof(vehicle_t));
// *((car)+num_cars) = read_csv(fp, v);
int car_n = 1000;
// n cars
vehicle_t **car = calloc(car_n, sizeof *car);
int num_cars = 0;
// v --- no !
while(num_cars < car_n && fgets(buffer, BUF_SIZE, fp)){
car[num_cars] = calloc(1, sizeof car[num_cars][0]);
car[num_cars] = read_csv(fp, v);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.