函数中结构的不明确行为

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(通过引用传递)调用该函数

这是解决此错误的方法:

  1. 编译器指向 addOrder(&data,&orderAmount); 行说了一些奇怪的“错误传递参数 1 blablabla”。我们实际上只需要了解“错误参数 1”。
  2. 会不会是编译器是对的,参数1有问题?
  3. 嗯哪一个是参数1,一定是&data.
  4. 查看data的声明,是Data data[orderAmount + 1];。这是一个数组!
  5. 初学者 class 他们教了我们什么?啊,当传递给函数时,数组会衰减为指向第一个元素的指针。所以不需要&.
  6. 将调用更改为 addOrder(data,&orderAmount);
  7. 再次编译。