我正在尝试打印我的结构。我希望它显示:
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;
}
答案 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;
}