所以我在掃描 2 個字串的地方撰寫了這段代碼。一個宣告為陣列,一個宣告為指標。現在我的問題是:為什么我需要在 printf-statment 中列印 text2 在 Text2 之前的“&”,而當我列印 Text1 時不需要?
我想如果我把“&”放在 printf 變數之前,它會列印記憶體地址。在這種情況下不是,它會列印字串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char Text1[45];
char *Text2;
scanf("%s" , &Text1);
printf("Text1: %s\n", Text1);
scanf("%s" , &Text2);
printf("Text2: %s\n", &Text2);
return 0;
}
uj5u.com熱心網友回復:
char Text1[45]是一個字符陣列。編譯器將在程式存盤器中分配 45 位供程式使用。位元組的值目前未知。因此,scanf("%s" , Text1)假設輸入字符少于 44 個,會將輸入字符放入此記憶體中,否則它將覆寫程式堆疊并可能崩潰。為了防止這個問題,你應該使用類似的東西Ds.
&在這種情況下無需使用。它對以這種方式宣告的陣列沒有多大作用。因此,您不需要它printf("%s\n", Text1)。但如果你愿意,你可以使用它。
char *Text2宣告一個指標變數。這意味著編譯器分配了足夠的空間來包含指標值。指標的值目前沒有定義,所以它不指向任何地方。如果您打算將其與字符一起使用,則需要為它們分配空間或以不同的方式分配空間。例如,Text2 = malloc(45)將分配 45 個位元組供使用并設定指向這些位元組的指標。或者您可以這樣做,將Text1陣列Text2 = Text1的第一個位元組的地址分配為指標。這樣,Text1陣列將用作位元組存盤。
因此,scanf("%s", Text2)將使用指標訪問位元組,要么由 malloc 分配,要么在 Text1 中。現在你需要printf("%s\n", Text2).
您不應該&在 Text2 上使用。它將回傳指標變數的地址,而不是位元組陣列的地址。你需要后者。所以用 &Text2 列印會回傳垃圾并可能導致崩潰。
順便說一句,如果您使用mallocfree ,那么如果不再需要分配的記憶體,這是一個好主意: free(Text2).
uj5u.com熱心網友回復:
讓我們暫時擺脫處理的部分Text1,只關注Text2. 這給我們留下了這樣的東西:
char *Text2;
scanf("%s" , &Text2);
printf("Text2: %s\n", &Text2);
您已宣告Text2為指標,但尚未將其初始化為指向任何可用空間。然后將該指標的地址scanf傳遞給,并將其與告訴scanf讀取字串的格式匹配,并將其存放在指定位置,因此不會將指標用作指標,而是scanf嘗試像使用它一樣使用它是一個陣列char。
為了使這項作業正常進行,我們希望將指標用作指標,并讓它指向一些可用的記憶體——我們想知道scanf該記憶體的大小,所以用戶不能輸入比我們輸入更多的資料提供了存盤空間。
#define MAXSIZE 128
char *Text2 = malloc(MAXSIZE);
scanf("7s", Text2); // note lack of ampersand here
printf("%s\n", Text2); // Now we don't need an ampersand here either.
uj5u.com熱心網友回復:
您的程式表現出未定義的行為,盡管推測未定義的行為幾乎毫無意義,但考慮以下內容可能會很有趣:
$ cat a.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
char text1[128] = {0};
char *text2;
char text3[128] = {0};
scanf("Ds" , &text2); /* Undefined behavior */
printf("Text1: %s\n", text1);
printf("Text3: %s\n", text3);
return 0;
}
$ echo abcdefghijklmnopHelloWorld | ./a.out
bash: child setpgid (96724 to 96716): Operation not permitted
Text1:
Text3: HelloWorld
上面顯示的行為表明在我的平臺上,正在寫入的文本正在&text2覆寫的值text3(這是堆疊溢位)。這僅僅是因為(在我的平臺上),當程式執行時,變數 text2 和 text3 在堆疊中相隔 16 個位元組。重申一下,代碼的行為是未定義的,實際性能會因運行位置的不同而有很大差異,但盡管有關于惡魔從你的鼻子飛出的神話般的警告,但嘗試它不太可能造成任何傷害。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506502.html
