簡體   English   中英

嘗試使用雙指針結構讀取 csv 文件並打印出條目,但我在 C 中收到“大小為 8 的無效讀取”

[英]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

創建 C 程序以將 csv 文件讀入雙指針結構,但出現分段錯誤。

這是結構:

typedef struct vehicle{
char *make;
char *model;
char *color;
char *license_plate;
int year;
}vehicle_t;

我在這個程序中使用了單指針和雙指針來更好地理解使用指針:

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);
}

這是我創建的 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 告訴我,當我嘗試從雙指針汽車打印車輛時,我遇到了一個問題:

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 錯誤信息:

Valgrind 錯誤消息

我通過釋放汽車雙指針來完成代碼:

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);
}

不知道為什么我會遇到分段錯誤。 以為我對指針使用有一個不錯的處理,並且看起來像正確分配和釋放 memory。

至少有這些問題:

錯誤的指針

(v)->make = calloc(strlen(tok)+1, sizeof(char));
tok = strtok(NULL, ",");  // ????
strcpy((v)->make, tok);

代碼很奇怪。 為什么要分配一個字符串長度,然后在復制之前更改tok

我期待更多類似的東西

(v)->make = calloc(strlen(tok)+1, sizeof(char));
strcpy((v)->make, tok);
tok = strtok(NULL, ",");

研究strdup()以獲取替代代碼。

只有 1 輛車,錯誤的fgets()用法

代碼僅分配給 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM