簡體   English   中英

C語言指針相關問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM