我對指向字符的指標的作業方式感到困惑。當我運行以下代碼時,會發生什么?
int main()
{
char* word;
scanf("%s",word);
printf("%s",word;
}
中的第一行main定義了一個沒有初始化的指向 char 的指標。scanf應該將單詞存盤在某個地方并將地址提供給指標,對嗎?如果我輸入一個大字串,它會覆寫記憶體中的某些內容嗎?
除了定義指向 char 的指標之外,以下代碼的第一行會發生什么。編譯器是否設定了一些限制?或者我不能超過指定的尺寸,對嗎?如果完成,我將有一個運行時錯誤,對嗎?這兩種情況有什么區別?
int main()
{
char word[100];
scanf("%s",word);
printf("%s",word;
}
指向其他型別的指標呢?我可以使用偏移量繼續寫入以下位置嗎?
uj5u.com熱心網友回復:
scanf 應該將單詞存盤在某個地方并將地址提供給指標,對嗎?
不,相反。您定義scanf存盤值的地址。當您未能初始化指向某個有效地址的指標時,您會導致未定義的行為,在最好的情況下可能會導致崩潰,或者在最壞的情況下似乎可以正常作業。
除了定義指向 char 的指標之外,以下代碼的第一行會發生什么。
根本不涉及指標。陣列不是指標。陣列提供存盤其所有成員所需的所有記憶體。指標不會這樣做。
編譯器是否設定了一些限制?或者我不能超過指定的尺寸,對嗎?
你可以隨心所欲地寫作。沒有人會阻止你這樣做。至少沒有嘗試。如果您寫入某個不屬于您分配的記憶體的位置,則會再次導致未定義的行為。
uj5u.com熱心網友回復:
根據%sC標準中轉換說明符的描述
如果不存在 l 長度修飾符,則相應的引數應是指向字符陣列的初始元素的指標,該元素足夠大以接受序列和終止的空字符,它將自動添加。
也就是說,當您將指標作為與格式相對應的函式的引數傳遞時,%s它應指向將存盤輸入字串的字符陣列的第一個元素。字符陣列應足夠大以容納輸入的字串(包括附加的終止零字符'\0')
在第一個程式中
int main()
{
char* word;
scanf("%s",word);
printf("%s",word;
}
指標word未初始化并且具有不確定的值。所以這兩個陳述
scanf("%s",word);
printf("%s",word;
呼叫未定義的行為。
您需要提供將指向字符陣列的指標的有效值。例如
char s[100];
char *word = s;
或者你可以像這樣動態分配記憶體
char *word = malloc( 100 * sizeof( char ) );
在第二個程式中
int main()
{
char word[100];
scanf("%s",word);
printf("%s",word;
}
word用作引數的陣列被隱式轉換為指向其第一個元素的指標。如果您將輸入一個適合包含 100 個元素的陣列的字串,則程式將正確運行。
但是,如果您輸入 100 個或更多字符而沒有嵌入空格,則程式將再次出現未定義的行為。
為避免這種情況,您可以word使用長度修飾符指定陣列中可以讀取的字串的最大長度,如下所示
scanf("
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361009.html
上一篇:取消參考指向串列的雙指標
