我想传递一个字符指针到一个函数,并让它设置值并将其传回。这是我的尝试,但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