将变量的地址传递给C函数

时间:2013-08-09 19:52:14

标签: c string pointers char memory-address

我对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)

任何人都可以帮我解决这个问题吗?

3 个答案:

答案 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