我在这里试图解决这个问题。问题是,我试图通过将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);
答案 0 :(得分:1)
CAR *car[]
表示CAR
指针的数组。
您想发送CAR car[]
结构CAR
数组。
同样,当您传递CAR
数组时,您可以像car[i].code
或car[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();