為什么第一個選項可以,但第二個選項應該使用動態記憶體而第一個不可以?
//first option
char *p = "hello";
//second option
char *p;
scanf("%s",p);
//and introduce hello on the terminal
uj5u.com熱心網友回復:
p此宣告中的指標
//first option
char *p = "hello";
指向字串文字“hello”的第一個字符,它作為型別的字符陣列存盤在記憶體中char[6]。
您可以通過以下方式想象它
char string_literal[] = "hello";
char *p = string_literal;
請注意,您可能不會更改指標指向的字串文字。任何更改字串文字的嘗試都會導致未定義的行為。例如你可能不會寫
char *p = "hello";
p[0] = 'H';
在此代碼段中
//second option
char *p;
scanf("%s",p);
指標p未初始化并且具有不確定的值。所以 scanf 的呼叫會呼叫未定義的行為。
至少你可以寫例如
char s[6];
char *p = s;
scanf( "%s, p ); // or scanf( "%5s", p );
輸入字串"hello";
或者,如果使用 sscanf 在您的評論中提到您可以寫的問題
char s[6];
char *p = s;
sscanf( "hello", "%s", p );
uj5u.com熱心網友回復:
因為在第一種情況下,編譯器(通常)為“靜態”記憶體中的字串分配記憶體。所以 p 指向包含字串常量的存盤。
第二種情況,p 未初始化,并且沒有指向任何內容。所以你必須為它分配記憶體。使用基于堆的分配的替代方法是定義類似
char p[100];
scanf("0s",p);
在這種情況下,您仍在分配記憶體,但在堆疊上。無論哪種方式,C 字串(和指標)都需要一些有效的記憶體區域來指向,無論它是在堆疊、堆還是靜態的。
uj5u.com熱心網友回復:
要在第二種情況下做你想做的事,你需要這樣做:
char *p;
printf("Enter a word: ");
scanf("%ms",&p);
printf("User entered '%s'\n",p);
free(p);
(in )的m選項告訴分配字串所需的任何記憶體。閱讀手冊頁以獲取更多詳細資訊。%sscanfscanfscanf
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/434174.html
上一篇:為什么我必須使用二維陣列?
