函数中结构的不明确行为
Unclear behavior of structs in a function
我正在创建一个项目,我遇到了不应该发生的行为(至少据我所知)。我正在尝试更改函数 addOrder 内的结构数组中的值。在 main() 中,我将结构的地址提供给函数 addOrder(这是第一个警告)。然后我尝试在命名函数中更改它的内容。我应该只能使用 -> 进行更改,但是,我以这种方式出现错误,我只能使用 data[0].someName
进行更改
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MENU_TITLE "----Welcome to order manager!---" // menu title
#define MENU_SIZE 4 //change based on menu options
#define INPUT_MSG "Please choose one of the following options" //enter input message (range is added later automatically)
#define SIZE 25 //size of option message array
#define STREET_NAME_SIZE 50 //size of street name array
#define BUILDING_NUMBER_SIZE 10 //size of building number array
#define EMAIL_SIZE 40 //size of email array
#define INPUT_PHONE_MAX 12
typedef struct Data{
char streetName[STREET_NAME_SIZE];
char buildingNumber[BUILDING_NUMBER_SIZE];
unsigned long long phoneNumber;
char email[EMAIL_SIZE];
}Data;
void loadOrderAmount(int *orderAmount);
void showMenu(char *menuTitle, int menuSize, char *inputMsg);
int getChoise();
void addOrder(Data *data, int *orderAmount);
void getEmail(char *email);
unsigned long long getPhoneNumber();
int main(){
int orderAmount = 0;
loadOrderAmount(&orderAmount);
Data data[orderAmount + 1];
int choise = 0;
showMenu(MENU_TITLE, MENU_SIZE, INPUT_MSG);
while(!choise){
choise = getChoise();
}
printf("\n");
switch(choise){
case 1:
addOrder(&data,&orderAmount); // This gives first warning
break;
case 2:
//removeOrder(data);
break;
case 3:
//editOrder(data);
break;
case 4:
printf("Have a nice day\n");
return 0;
}
printf("in main data %d\n",&data);
//printf("%s %s ",data[0].streetName,data[0].buildingNumber);
//printf("+%llu ",data[0].phoneNumber);
printf("in main %s %llu\n",data[0].email,data[0].phoneNumber);
return 0;
}
void addOrder(Data *data,int *orderAmount){
int amount = *orderAmount; //it is equal to 0
char email[41];
char street[51];
char buildingNumber[11];
printf("Adding an order...\n\n");
//++orderAmount;
// getStreetName(data, &orderAmount);
// getBuildingNumber(data,&orderAmount);
data[amount]->phoneNumber = getPhoneNumber(); //why this does not work?
getEmail(email);
strcpy(data[0].email,email); // why this works? its a function....
printf("In function data %d\n", data);
printf("in struct %s %llu\n",data[0].email, data[0].phoneNumber);
}
}
这只是相关代码的一部分,大部分功能都缺失了。谁能帮我解决这个问题?
函数addOrder
声明为
void addOrder(Data *data, int *orderAmount);
但是你调用它传递类型的第一个参数Data ( * )[orderAmount + 1]
addOrder(&data,&orderAmount);
你需要这样称呼它
addOrder( data, &orderAmount );
而不是这个声明
data[amount]->phoneNumber = getPhoneNumber();
你必须写
data[amount].phoneNumber = getPhoneNumber();
而不是这个调用
printf("In function data %d\n", data);
你必须写
printf("In function data %p\n", ( void * )data);
注意函数内部的表达式
data[amount]
和
data[0]
不一样,因为数量不等于零。使用分配给 amount
.
的参数 orderAmount
(通过引用传递)调用该函数
这是解决此错误的方法:
- 编译器指向
addOrder(&data,&orderAmount);
行说了一些奇怪的“错误传递参数 1 blablabla”。我们实际上只需要了解“错误参数 1”。
- 会不会是编译器是对的,参数1有问题?
- 嗯哪一个是参数1,一定是
&data
.
- 查看
data
的声明,是Data data[orderAmount + 1];
。这是一个数组!
- 初学者 class 他们教了我们什么?啊,当传递给函数时,数组会衰减为指向第一个元素的指针。所以不需要
&
.
- 将调用更改为
addOrder(data,&orderAmount);
- 再次编译。
我正在创建一个项目,我遇到了不应该发生的行为(至少据我所知)。我正在尝试更改函数 addOrder 内的结构数组中的值。在 main() 中,我将结构的地址提供给函数 addOrder(这是第一个警告)。然后我尝试在命名函数中更改它的内容。我应该只能使用 -> 进行更改,但是,我以这种方式出现错误,我只能使用 data[0].someName
进行更改#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MENU_TITLE "----Welcome to order manager!---" // menu title
#define MENU_SIZE 4 //change based on menu options
#define INPUT_MSG "Please choose one of the following options" //enter input message (range is added later automatically)
#define SIZE 25 //size of option message array
#define STREET_NAME_SIZE 50 //size of street name array
#define BUILDING_NUMBER_SIZE 10 //size of building number array
#define EMAIL_SIZE 40 //size of email array
#define INPUT_PHONE_MAX 12
typedef struct Data{
char streetName[STREET_NAME_SIZE];
char buildingNumber[BUILDING_NUMBER_SIZE];
unsigned long long phoneNumber;
char email[EMAIL_SIZE];
}Data;
void loadOrderAmount(int *orderAmount);
void showMenu(char *menuTitle, int menuSize, char *inputMsg);
int getChoise();
void addOrder(Data *data, int *orderAmount);
void getEmail(char *email);
unsigned long long getPhoneNumber();
int main(){
int orderAmount = 0;
loadOrderAmount(&orderAmount);
Data data[orderAmount + 1];
int choise = 0;
showMenu(MENU_TITLE, MENU_SIZE, INPUT_MSG);
while(!choise){
choise = getChoise();
}
printf("\n");
switch(choise){
case 1:
addOrder(&data,&orderAmount); // This gives first warning
break;
case 2:
//removeOrder(data);
break;
case 3:
//editOrder(data);
break;
case 4:
printf("Have a nice day\n");
return 0;
}
printf("in main data %d\n",&data);
//printf("%s %s ",data[0].streetName,data[0].buildingNumber);
//printf("+%llu ",data[0].phoneNumber);
printf("in main %s %llu\n",data[0].email,data[0].phoneNumber);
return 0;
}
void addOrder(Data *data,int *orderAmount){
int amount = *orderAmount; //it is equal to 0
char email[41];
char street[51];
char buildingNumber[11];
printf("Adding an order...\n\n");
//++orderAmount;
// getStreetName(data, &orderAmount);
// getBuildingNumber(data,&orderAmount);
data[amount]->phoneNumber = getPhoneNumber(); //why this does not work?
getEmail(email);
strcpy(data[0].email,email); // why this works? its a function....
printf("In function data %d\n", data);
printf("in struct %s %llu\n",data[0].email, data[0].phoneNumber);
}
}
这只是相关代码的一部分,大部分功能都缺失了。谁能帮我解决这个问题?
函数addOrder
声明为
void addOrder(Data *data, int *orderAmount);
但是你调用它传递类型的第一个参数Data ( * )[orderAmount + 1]
addOrder(&data,&orderAmount);
你需要这样称呼它
addOrder( data, &orderAmount );
而不是这个声明
data[amount]->phoneNumber = getPhoneNumber();
你必须写
data[amount].phoneNumber = getPhoneNumber();
而不是这个调用
printf("In function data %d\n", data);
你必须写
printf("In function data %p\n", ( void * )data);
注意函数内部的表达式
data[amount]
和
data[0]
不一样,因为数量不等于零。使用分配给 amount
.
orderAmount
(通过引用传递)调用该函数
这是解决此错误的方法:
- 编译器指向
addOrder(&data,&orderAmount);
行说了一些奇怪的“错误传递参数 1 blablabla”。我们实际上只需要了解“错误参数 1”。 - 会不会是编译器是对的,参数1有问题?
- 嗯哪一个是参数1,一定是
&data
. - 查看
data
的声明,是Data data[orderAmount + 1];
。这是一个数组! - 初学者 class 他们教了我们什么?啊,当传递给函数时,数组会衰减为指向第一个元素的指针。所以不需要
&
. - 将调用更改为
addOrder(data,&orderAmount);
- 再次编译。