Печать массива структуры Ошибка сегментации - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь распечатать мою структуру.Я хочу, чтобы это показывало:

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 голосов
/ 19 февраля 2019

Вам нужно передать 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;
}
0 голосов
/ 19 февраля 2019

Обработка 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 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...