gpt4 book ai didi

c - 将 char** 传递给函数

转载 作者:行者123 更新时间:2023-11-30 18:24:07 25 4
gpt4 key购买 nike

我将总结我的代码,因为它相当大。在 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�

有人可以帮忙吗?

最佳答案

很多人已经指出了这段代码中的问题。我不想重复它们,但我想提出一种有助于通过指针传递 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 原型(prototype),但会在调用 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 原型(prototype)以返回 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. 在被调用者内部,始终将变量引用为 *varName。切勿直接使用 varName

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

希望这有帮助!

关于c - 将 char** 传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44211594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com