将char **传递给函数

时间:2017-05-27 00:01:35

标签: c pointers char

我会总结一下我的代码,因为它非常大。在main我有这个:

int main() {
    char **name_ptr;

    int ret = get_name(name_ptr);
    if(ret == 1)
        printf("main: %s\n", *name_ptr);
}

在函数get_name中,我有这个:

int get_name(char **name) {
    char buffer[30]; 
    name = malloc(sizeof(char **));
    *name = &buffer[0];
    printf("get_name: %s\n", *name);
    return 1;
}

缓冲区来自tcp连接及其正确,这是一个字符串,表示" the_name"。

我的输出是

get_name: the_name
main: ��i�

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:5)

多人已经在此代码中指出了问题。我不想重复它们,但我想提出一种有助于通过指针传递OUT值的方法。

你可能想要的是:

int main() {
    char *name_ptr;

    int ret = get_name(&name_ptr);
    if(ret == 1)
        printf("main: %s\n", name_ptr);
}

注意上面的name_ptr如何成为一个简单的char *,并将其地址传递给func。这不会更改get_name's原型,但会使调用func(main)中的name_ptr变得更容易。

现在:

int get_name(char **name) {
    char buffer[30] = "hello"; // data read fromsocket
    size_t len = 5; // size of data read from socket
    *name = malloc(len+1);
    memcpy(*name, buffer, len);
    *name[len] = 0;
    printf("get_name: %s\n", *name);
    return 1;
}

请注意,get_name内部我只使用*name。我从不使用**namename。这种方法在指针逻辑方面使事情变得更加简单。

我为终止null添加了一个额外的字节。这显然是可选的,即如果套接字上的数据以空值终止。或者,您可以修改get_name's原型以返回len:

int get_name(char **name, size_t *name_len) {
    char buffer[30] = "hello"; // data read fromsocket
    size_t len = 5; // size of data read from socket
    *name = malloc(len);
    memcpy(*name, buffer, len);
    *name_len = len;
    printf("get_name: %.*s\n", *name_len, *name);
    return 1;
}

再次注意我如何使用*name_len代替name_len

现在调用者会这样做:

char *name_ptr;
size_t len;

int ret = get_name(&name_ptr, &len);
if(ret == 1)
    printf("main: %.*s\n", len, name_ptr);

所以我建议遵循的规则是:

  1. 通过&
  2. 获取地址来传递变量
  3. 在被调用者内部,始终将变量引用为*varName。切勿直接使用varName
  4. 这些简单的规则应该让您的生活更轻松。

    希望这有帮助!