我会总结一下我的代码,因为它非常大。在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�
有人可以帮忙吗?
答案 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
。我从不使用**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;
}
再次注意我如何使用*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);
所以我建议遵循的规则是:
&
*varName
。切勿直接使用varName
。这些简单的规则应该让您的生活更轻松。
希望这有帮助!