繁体   English   中英

为什么我用strcpy()遇到分段错误

[英]why am i getting segmentation fault with strcpy()

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>

尝试将字段放入我的结构中,但是当我在其中将它们strcpy时却遇到了分段错误

typedef struct country {
    char code_name[3];
    char name[44];
    int population;
    float life_expect;
}country[244];

country *data;

int main(void) {


    char c;
    char *ptr;
    int i;
    int temp;
    char buf[512];
    char *token;

    FILE *fptr;
    fptr = fopen("AllCountries.dat", "r");

在这里我叫strcpy(data[i]->code_name, token)我得到了一个分段的fualt。 这是为什么? 我究竟做错了什么?

    do {
        if (fgets(buf, 512 , fptr)){
            //printf("%s\n",buf);
            token = strtok(buf,",");
            while (token != NULL){          
            token = strtok(NULL, ",");
                if (temp == 0){
                strcpy(data[i]->code_name, token);
                printf("%s, ",token);
                } temp = temp + 1;
            //printf("%s, ",token); 
            //printf("code_name: %s\n", data->code_name);                   
            }
        i++;
        temp = 0;
        }

    }while ((feof(fptr))  != EOF);
    fclose(fptr);
    return 0;
}

文件

115,DZA,Algeria,Africa,Northern Africa,2381741,1962,31471000,69.7,49982,Al-Jazair/Algérie,Republic,Abdelaziz Bouteflika,35,DZ
146,AGO,Angola,Africa,Central Africa,1246700,1975,12878000,38.3,6648,Angola,Republic,José Eduardo dos Santos,56,AO
94,BEN,Benin,Africa,Western Africa,112622,1960,6097000,50.2,2357,Bénin,Republic,Mathieu Kérékou,187,BJ
129,BWA,Botswana,Africa,Southern Africa,581730,1966,1622000,39.3,4834,Botswana,Republic,Festus G. Mogae,204,BW
193,IOT,British Indian Ocean Territory,Africa,Eastern Africa,78,NULL,0,NULL,0,British Indian Ocean Territory,Dependent Territory of the UK,Elisabeth II,NULL,IO
95,BFA,Burkina Faso,Africa,Western Africa,274000,1960,11937000,46.7,2425,Burkina Faso,Republic,Blaise Compaoré,549,BF

您声明了一个指针变量data ,但从未将其分配为指向任何内存。 您需要在main()执行此操作:

data = malloc(sizeof(*data));

但是这里并不需要指针,只需声明一个普通变量即可:

country data;

实际上,我建议您不要将数组维度放在类型定义中。 您应该声明结构类型,然后声明结构数组。

typedef struct country {
    char code_name[3];
    char name[44];
    int population;
    float life_expect;
} country;

country data[244];

如果您仍然想使用指针而不是常规变量,它将是:

country *data;

然后在main()您将执行以下操作:

data = malloc(244 * sizeof(*data));

您还需要初始化i

int i = 0;

}while ((feof(fptr))  != EOF);

是错的。 当到达EOF时, feof()返回1 ,而不是EOF 它应该是:

} while (!feof(fptr));

因为目的地data是类型定义country的指针,所以为NULL。

strcpy()访问给定的NULL和segfaults。

变量data是全局变量,在C中初始化为NULL。

参考: 为什么将全局变量和静态变量初始化为其默认值? 全局变量在C中是否总是被初始化为零?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM