【发布时间】:2022-08-14 05:21:34
【问题描述】:
我正在尝试实现一个快速原型程序来准备一条我打算用作 tcp 套接字通信协议的消息。 我对此很陌生,我不太明白为什么要运行以下打印(null)。我是否未能将指针传递给子例程?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *header = \"testhd\";
void pack_message(char *body, char *buffer)
{
size_t body_size, msg_size, buffer_size;
char hex_size[11];
body_size = strlen(body);
snprintf(hex_size, 11, \"0x%x\", body_size);
msg_size = 16 + body_size;
buffer_size = msg_size + 1;
if (!buffer){
buffer = malloc(buffer_size);
}else{
buffer = realloc(buffer, buffer_size);
}
memset(buffer, 0, buffer_size);
strcat(buffer, header);
strcat(buffer, hex_size);
strcat(buffer, body);
}
int main(){
char *buffer = NULL;
char *body = \"testmsg\";
pack_message(body, buffer);
printf(\"%s\", buffer);
return 0;
}
-
请记住,C 中的参数是通过按价值.这意味着调用中的值是复制了进入函数局部参数变量。对局部参数变量的任何更改,例如分配给它,只会发生在该局部变量上。调用中使用的原始值不会受到影响。请研究在 C 中模拟通过引用传递.提示:它涉及指针和指向运算符
&。 -
当你弄清楚缓冲区问题后,你仍然需要处理释放分配的块(否则程序会泄漏内存......)
-
你不能在调用者中声明(或分配)一个足够大的缓冲区,然后让你的\'pack\'函数尽可能多地填充(不溢出!)吗?
标签: c pointers memory-management dynamic malloc