2017-02-11 110 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是您描述的未定义行为的相关部分:“如果左值指定自动存储持续时间的对象...并且该对象未初始化...,则行为是未定义“。如果有另一个更适合这种情况的引用,请将它传递给它。 –