我将总结一下我的代码,因为它非常大.在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.我从不使用**name或name.这种方法在指针逻辑方面使事情变得更加简单.
我为终止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)
所以我建议遵循的规则是:
&*varName.切勿varName直接使用.这些简单的规则应该让您的生活更轻松.
希望这可以帮助!