将char**传递给函数

new*_*guy -1 c pointers char

我将总结一下我的代码,因为它非常大.在main我有这样的:

int main() {
    char **name_ptr;

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

在函数中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;
}
Run Code Online (Sandbox Code Playgroud)

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

我的输出是

get_name: the_name
main: ??i?
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

小智 5

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

你可能想要的是这个:

int main() {
    char *name_ptr;

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

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

现在:

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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,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;
}
Run Code Online (Sandbox Code Playgroud)

再次注意我如何使用*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);
Run Code Online (Sandbox Code Playgroud)

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

  1. 通过获取地址来传递变量 &
  2. 在被调用者内部,始终将变量引用为*varName.切勿varName直接使用.

这些简单的规则应该让您的生活更轻松.

希望这可以帮助!