我想傳遞一個字符指針到一個函數,並讓它設置值並將其傳回。這是我的嘗試,但printf打印垃圾,我哪裏錯了?C字符數組指針
int a() {
char *p;
b(p);
printf("%s", p);
return 0;
}
int b(char * ptr) {
ptr = "test string";
return 0;
}
我想傳遞一個字符指針到一個函數,並讓它設置值並將其傳回。這是我的嘗試,但printf打印垃圾,我哪裏錯了?C字符數組指針
int a() {
char *p;
b(p);
printf("%s", p);
return 0;
}
int b(char * ptr) {
ptr = "test string";
return 0;
}
傳遞對指針的引用。
int b(char **ptr)
{
*ptr = "Print statement";
//your code
}
//call
b(&p);
如果你想設置的指針的值,並將它傳遞回來,然後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;
}
你打算給'b'返回一個'char *'類型。但是在這段代碼中,函數參數是多餘的,應該刪除。 (實際上'b(p)'通過使用未初始化的指針值導致未定義的行爲)。 –
@ M.M--感謝您的評論。我認爲現在一切都是固定的。我相信關於_lvalue conversion_的C11§6.3.2.12是您描述的未定義行爲的相關部分:「如果左值指定自動存儲持續時間的對象...並且該對象未初始化...,則行爲是未定義「。如果有另一個更適合這種情況的引用,請將它傳遞給它。 –
我知道這是吹毛求疵,但我會改變'字符**''來爲const char **',因爲它是一個常數串。 – d3L
我自己並不熟悉使用const指針,所以不能提示。 – Pbd
「Print語句」是一個常量字符串,很可能會放在可執行文件的只讀部分中。修改它將導致崩潰。 'const char *'''防止''修改字符串。 – d3L