Char指针被覆盖

时间:2013-02-01 22:09:06

标签: c struct

所以在我的程序中有一个结构:

typedef struct Point {
    double x, y;
    char *label;
} point;

然后我从文件中读取一些信息,并为数组中的各种点结构分配各种标签。问题是虽然正确分配了x,y值,但内存中每个结构的标签都是相同的。

point set[3];

FILE *file = fopen(argv[1], "r");

int count = 0;
char *pch;
char line[128];

if(file != NULL){
    while(fgets (line, sizeof line, file) != NULL){
        pch = strtok(line, " ");
        int i = 0;

        while(pch != NULL){
            if(i==0){set[count].label = pch;}
            if(i==1){set[count].x = atof(pch);}
            if(i==2){set[count].y = atof(pch);}
            pch = strtok(NULL, " ");
            i++;
        }
        count++;
    }
    fclose(file);
}

//these values should not be the same, though they are
printf("%s\n", set[0].label); 
printf("%s\n", set[1].label);

是否有某种解决方法可以使我的结构保持不变并正确分配值?

2 个答案:

答案 0 :(得分:4)

您需要为每个标签instance分配内存。作为数组

typedef struct Point {
    double x, y;
    char label[50];
} point;

strcpy(set[count].label, pch);

或通过为每个label实例动态分配内存

set[count].label = malloc(strlen(pch)+1);
strcpy(label, pch);

(在后一种情况下确保稍后free(set[count].label)

答案 1 :(得分:0)

所有指针指向相同的内存位置,这可以通过更改来完成 结构成员标签为

char label[100];

或通过动态分配这样的内存,

if(i==0){
    set[count].label = (char *) malloc(sizeof(char)*(strlen(pch)+1));
    strcpy(set[count].label,pch);
}