打印结构分割错误数组

时间:2019-02-19 09:40:07

标签: c

我正在尝试打印我的结构。我希望它显示:

id: BBB-188
brand: BMW
pic: 1 2 3. 

现在的结果是:

id: BBB-188 
name: BMW 
Segmentation fault: 11.

有人知道我的代码有什么问题吗?

#define MAX 10000
#define IDSIZE 11
#define BRANDSIZE 50
#define PICSIZE 10

typedef struct{
    char id[IDSIZE+1];
    char brand[BRANDSIZE+1];
    int *pic;
} Car;

void printCar(Car *pCar,int carcount, int imagecount) {  
    printf("id: %s \n",pCar->id);
    printf("brand: %s \n",pCar->brand);
    for(int i=0; i< imagecount; i++){
        printf("pic: %d \n",pCar->pic[i]);
    }
}

Car initCar(char itsId[],char itsBrand[],int itsPic, int     imagecount){
    Car newCar;
    strcpy(newCar.id, itsId);
    strcpy(newCar.brand, itsBrand);
    for (int i = 0; i < imagecount; i++){
        newCar.pic = itsPic;
    }
    return newCar;
}

int main(void){
    int carcount=0;
    int imagecount=0;

    int test[3]={1,2,3};

    Car myCar = initCar("BBB-188","BMW", test, 3 );

    carcount=1;
    imagecount=3;

    printCar(&myCar,carcount,imagecount);

    return 0;
}

2 个答案:

答案 0 :(得分:3)

pic的处理被破坏并且非常混乱。

您似乎想将其表示为整数数组,但不存储长度。因此,它必须始终为三个,但是您只能在结构中使用一个数组,即:

int pic[3];

代替

int *pic;

initCar()内的分配也没有意义,这是在循环,而只是将相同的整数值(!)分配给指针imagecount次,没有数据被复制。

如果要使图片数组的长度真正可变,则必须存储长度并分配用于容纳数字的内存。因此,在initCar()中,您必须具有:

newCar.pic = malloc(imagecount * sizeof *newCar.pic);
memcpy(newCar.pic, itsPic, imagecount * sizeof *newCar.pic);

但是itsPic当然必须是const int *类型。

答案 1 :(得分:1)

您需要将itsPic作为指针传递到initCar中。如果您这样做的话,就不需要for循环来实现效果。

Car initCar(char itsId[],char itsBrand[],int* itsPic, int imagecount){
    Car newCar;
    strcpy(newCar.id, itsId);
    strcpy(newCar.brand, itsBrand);
    //for (int i = 0; i < imagecount; i++){
      newCar.pic = itsPic;
    //}
    return newCar;
}