发送struct数组时程序崩溃

时间:2017-11-18 16:22:37

标签: c arrays struct

我在这里试图解决这个问题。问题是,我试图通过将struct array函数的地址发送到其特定函数(初始化它)来初始化main()。但是当我运行它时,它总是崩溃。但是,程序一直持续到那边的旗帜!请帮帮我

ps:

错误消息显示:

  

45 [警告]传递' initfunc'的参数1来自不兼容的指针类型[默认启用]

typedef struct{
   int code, year, rentstate;
   char type[50];
   float price;
}CAR;

void initfunc(CAR *car[]){
    int i;

    printf("flag ok");
    for(i=0;i<50;i++)           
    {
        car[i]->code = 0;  
        printf("initializing...");
    }
    getch();
}

int main(int argc, char const *argv[])              
{
    int opt, a=0;
    CAR car[50];

    initfunc(car);          

2 个答案:

答案 0 :(得分:1)

CAR *car[] 表示CAR指针的数组。

您想发送CAR car[]结构CAR数组。

同样,当您传递CAR数组时,您可以像car[i].codecar[i].year那样访问它。

如果是code而不是CAR*,您必须访问CAR

例如:

CAR *car = malloc( sizeof *car);
...
(*car).code = //..
equivalently

car->code = //...

在您的情况下,代码将是

void initfunc(CAR car[]){ // void initfunc(CAR *car)

    printf("flag ok");

    for(size_t i = 0; i < 50; i++)           
    {
        car[i].code = 0;  
        printf("initializing...");
    }
    getch();
}

OP问为什么将数组更改为被调用函数会更改main()中的数组?

由于我们实际上是将指针传递给原始数组,因此更改被调用函数会修改原始数组。在C中,除少数特殊情况外,数组引用始终“衰减”为指向第一个数组的指针数组的元素。

C中,一切都是按值传递的。因此,我们在被调用函数中看到的指针变量包含地址的副本。对数组元素所做的任何更改(通过取消引用指针)都会影响原始数组,[因为只复制了数组地址(而不是数组元素本身)]。

简单地说,在这里传递数组的第0个元素的地址,然后访问它。这就是因为您通过指针访问原始元素而不是它们的副本而反映出更改的原因。

答案 1 :(得分:0)

我只是这样试过:

    typedef struct{
       int code, year, rentstate;
       char type[50];
       float price;
    }CAR;

    void initfunc(CAR car[]){
        int i;

        printf("flag ok");
        for(i=0;i<50;i++)           
        {
            car[i].code = 0;  
            printf("initializing...");
        }
        getch();
    }

    int main(int argc, char const *argv[])              
    {
        int opt, a=0,i ;
        CAR car[50];

        for(i=0;i<50;i++){. 

            car[i].code = -1;
            printf("%d", car[i].code);
        }// RECEIVING -1 JUST TO TEST IF IT REALLY CHANGES AFTER I CALL THE FUNCTION TO INITIALIZE


        printf("\n\n");
        initfunc(car);      //HERE WE'RE SUPPOSED TO INITIALIZE 
        printf("\n\n");


        for(i=0;i<50;i++){
            printf("%d", car[i].code); 
        }
        printf("\n\n");  // OMG THIS CANT HAPPEN, WHY IS THIS EVEN HAPPENING? IM NOT EVEN USING POINTERS!


        getch();