我是 C 的初學者,遇到了分段錯誤,這就是我所理解的程式試圖訪問受限或不可用的記憶體區域。
我在一個函式中發生了這個問題:
void process_command(struct pizzeria *the_pizzeria, char *command) {
if (command[0] == 'n') {
struct order **last_next_order_field = get_last_next_order_field(the_pizzeria);
*last_next_order_field = create_order();
}
if (command[0] == 's') {
//Line below receives error
get_integer_input(the_pizzeria->selected_order, "");
}
}
這與其他功能相關聯:
void get_integer_input(int *variable, char *prompt) {
printf(prompt);
scanf("%d", variable);
getchar();
}
必須注意的是,這些函式與這個結構有關:
#define PIZZERIA_NAME_LENGTH 16
#define PIZZERIA_OWNER_LENGTH 16
struct pizzeria {
char name[PIZZERIA_NAME_LENGTH];
char owner[PIZZERIA_OWNER_LENGTH];
int selected_order;
struct order *orders;
};
我不明白為什么當傳入函式時從整數中the_pizzeria->selected_order生成指標而不進行強制轉換,就像我過去獲取字符輸入的函式一樣,我使用相同的程序并且沒有收到錯誤。get_interger_inputprocess_command
我還將變數設定為指標,所以我不明白終端產生的注釋:
注意:預期為“int *”,但引數為“int”型別
void get_integer_input(int *variable, char *prompt)
uj5u.com熱心網友回復:
您沒有向我們展示這些“過去的功能”,但我假設他們向用戶詢問姓名或所有者。結構的這些元素是陣列,如果將它們的名稱作為引數傳遞,它會衰減為指向第一個元素的指標。
相反,整數不是陣列。因此,您需要像這樣傳遞它的地址:
if (command[0] == 's') {
get_integer_input(&the_pizzeria->selected_order, "");
}
如果您對運算子優先級不是很嚴格,最好使用括號:
if (command[0] == 's') {
get_integer_input(&(the_pizzeria->selected_order), "");
}
編譯器的診斷訊息是正確的。您傳遞一個整數,但函式需要一個指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506508.html
