我对C比较新。我试图将变量的地址传递给函数,然后让该函数为这个传递的变量地址分配一个char指针。编译器没有抱怨,但代码也无法正常工作。
typedef enum {
VAL_1,
VAL_2
} member_type;
char *a1="Test 123";
int func (member_type x, char *temp) {
switch(x) {
case VAL_1:
temp = a1;
return 1;
case VAL_2:
return 2;
}
return 0;
}
int main(){
member_type b;
static char *d1;
b = VAL_1;
printf("%p\n",&d1);
func(b, &d1);
printf("Val_1:%s\n",d1);
return 0;
}
执行时出现以下错误:
-bash-3.00$ ./a.out
0x500950
Name:(null)
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
我觉得奇怪的是你的编译器没有抱怨。我怀疑你正在编译而没有警告。您应该始终使用启用的-Wall
选项进行编译(假设您使用的是GCC或clang)。
你做错了是虽然你将char *
指针的地址传递给你的函数,但你只修改了该指针的本地副本(函数参数通过C中的值传递),功能以外没有效果。你应该做的是将函数参数声明为指向指针,并通过解除引用其地址来修改原始指针:
void func(const char **p) // notice the pointer-to-pointer...
{
*p = "bar"; // and the dereference (*) operator
}
const char *p = "foo";
printf("Before: %s\n", p);
func(&p);
printf("After: %s\n", p);
打印:
Before: foo
Afte: bar
答案 1 :(得分:1)
您需要双重取消引用:
typedef enum {
VAL_1,
VAL_2
} member_type;
char *a1="Test 123";
int func (member_type x, char **temp) {
switch(x) {
case VAL_1:
temp = &a1;
return 1;
case VAL_2:
return 2;
}
return 0;
}
int main(){
member_type b;
static char *d1;
b = USERNAME;
printf("%p\n",&d1);
func(USERNAME, &d1);
printf("Val_1:%s\n",d1);
return 0;
}
答案 2 :(得分:0)
复制你的代码并在func中只进行了两次更改:1)char ** temp 和* temp = a1。回想一下,a1是一个指针,就像是* temp。
typedef enum {
VAL_1,
VAL_2
} member_type;
char *a1 = "Test 123";
int func (member_type x, char **temp) {
switch(x) {
case VAL_1:
*temp = a1; // need to dereference the double ptr
return 1;
case VAL_2:
return 2;
}
return 0;
}
int main(){
member_type b;
static char *d1;
b = VAL_1;
printf("%p\n", &d1); // point to the pointer d1
func(b, &d1); // point to the pointer d1
printf("Val_1:%s\n",d1);
return 0;
}
在Eclipse / Microsoft C编译器上运行此代码,并打印:
004054A0
Val_1:Test 123