2017-02-11 113 views
1

我想傳遞一個字符指針到一個函數,並讓它設置值並將其傳回。這是我的嘗試,但printf打印垃圾,我哪裏錯了?C字符數組指針

int a() { 
    char *p;  
    b(p);  
    printf("%s", p); 
    return 0; 
} 

int b(char * ptr) { 
    ptr = "test string"; 
    return 0; 
} 

回答

3

傳遞對指針的引用。

int b(char **ptr) 
{ 
    *ptr = "Print statement"; 
    //your code 
} 
//call 
b(&p); 
+0

我知道這是吹毛求疵,但我會改變'字符**''來爲const char **',因爲它是一個常數串。 – d3L

+0

我自己並不熟悉使用const指針,所以不能提示。 – Pbd

+0

「Print語句」是一個常量字符串,很可能會放在可執行文件的只讀部分中。修改它將導致崩潰。 'const char *'''防止''修改字符串。 – d3L

2

如果你想設置的指針的值,並將它傳遞回來,然後b()需要返回一個指針:

int a(void) { 
    char *p = NULL;  
    p = b(p);  
    printf("%s", p); 
    return 0; 
} 

char * b(char * ptr) { 
    ptr = "test string"; 
    return ptr; 
} 

這裏p被初始化爲NULL,以避免傳遞一個未定義的行爲未初始化的值給一個函數。您也可以將p初始化爲另一個字符串文字。在b的內部,ptr是傳遞給b的指針p的副本。當您將存儲在ptr中的值重新分配到字符串字面值"test string"的地址時,原始指針p未更改。通過將ptr傳遞迴調用函數,並將p重新指定爲返回值b,調用函數可以使用更新的值。

由於@M.M在評論中指出,這有點多餘。功能b()可以改爲宣佈了自己的指針,初始化字符串文字:

int a(void) { 
    char *p = b();  
    printf("%s", p); 
    return 0; 
} 

char * b(void) { 
    char *ptr = "test string"; 
    return ptr; 
} 
+0

你打算給'b'返回一個'char *'類型。但是在這段代碼中,函數參數是多餘的,應該刪除。 (實際上'b(p)'通過使用未初始化的指針值導致未定義的行爲)。 –

+1

@ M.M--感謝您的評論。我認爲現在一切都是固定的。我相信關於_lvalue conversion_的C11§6.3.2.12是您描述的未定義行爲的相關部分:「如果左值指定自動存儲持續時間的對象...並且該對象未初始化...,則行爲是未定義「。如果有另一個更適合這種情況的引用,請將它傳遞給它。 –