[英]C language Pointer related questions
嗨,我現在正在研究指針。 但是在學習的時候,我有一個問題,我想問
#include<stdio.h>
void store1(char **p){
char *tmp = "hello";
*p = tmp;
return;
}
void store2(char *p){
char *tmp = "hello";
p = tmp;
return;
}
int main(){
char *p;
//store1(&p, num);
store2(p);
printf("%s\n", p);
}
這是我的問題 為什么 store1 function 沒有段故障而 store2 function 有段故障?
為什么我們要傳遞一個 char** 類型的變量作為參數來存儲一個字符串?
如果 char* 類型作為參數傳遞,char* tmp 變量和類型匹配,那么它不應該存儲在 p 中嗎?
聰明的兄弟請告訴我
store2(p)
不會改變p
,因此 main 中p
的值保持未初始化。 隨后的printf("%s\n", p);
因此調用未定義的行為。 (實際上,我不是語言律師,但我很確定在 p 未初始化時調用store2(p)
會調用 UB。)在store1
中,您傳遞p
的地址,並且對store1
的調用能夠修改main 中p
的值,因此它現在指向一個字符串文字,並且隨后的printf
是有效的。
在這里,我重新編寫了您的代碼並更改了一些變量名稱以簡化下面的討論:
#include<stdio.h>
void store1(char **a){ *a = "hello"; return; }
void store2(char *b){ b = "hello"; return; }
int
main(void)
{
char *p = NULL;
store2(p); /* After store2 returns, p is still NULL */
store1(&p); /* store1 assigns a value to p */
printf("%s\n", p);
}
在上面,當調用store2
時, b
被賦值為 NULL,但該值從未使用過。 b
實際上是一個局部變量,它被分配了字符串文字“hello”的地址,並且該變量在store2
返回時被丟棄。 但是, a
被分配了p
的地址,並且賦值*a = "hello"
將p
設置為字符串文字 "hello" 的地址。
看這里。 我內聯了 function:
int main(void)
{
char *p;
char *q;
q = p; // Pointless statment because q is overwritten
q = "hello"; // right here
puts(p);
}
C 是(在預處理器之外,這是它自己的可怕野獸),嚴格按值傳遞。
因此,當人們實際上說“傳遞變量”時,幾乎總是意味着“傳遞變量的值”。 是的,馬虎的說話(和/或思考)會使項目陷入困境。
在極少數情況下,“傳遞變量”實際上意味着它所說的,即通過“傳遞變量的地址”來模擬。 因為它比較少見,而且更簡單的短語已被篡改,所以如果這就是您的意思,請明確說明。
自然,更改副本對源根本沒有影響,副本也不反映事后對源的更改。
現在您知道了為什么main()
中的p
在調用store2()
之后仍然不確定,以及為什么將其視為(指向)字符串會導致Undefined Behavior 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.