我陷入困境,无法弄清楚为什么这个功能代码无法正常工作。代码来自irc客户端,将数据发送到服务器。
此代码有效:
void write_socket(char msg[512]) {
//////// Convert from unicode to encoding ////////
iconv_t cd = iconv_open(encoding, "UTF-8");
char buffer[512];
char *outptr = (char *) &buffer[0];
size_t insize = 512;
size_t outsize = 512;
iconv(cd, &msg, &insize, &outptr, &outsize);
msg = buffer;
printf("(%lu) msg: %s\n", strlen(msg), msg);
int n = write(sockfd, msg, strlen(msg));
if (n < 0)
error("Error writing to socket");
}
当我致电write_socket("NICK kiyoshi\r\n");
时
它给出了这个输出:(14) msg: NICK kiyoshi
并成功连接到服务器。
此代码不起作用:
void write_socket(char *msg) {
encode(&msg, 512);
printf("encode: (%lu) msg: %s\n", strlen(msg), msg);
int n = write(sockfd, msg, strlen(msg));
if (n < 0)
error("Error writing to socket");
}
void encode(char **str, int size) {
if (*encoding) {
//////// Convert from unicode to encoding ////////
iconv_t cd = iconv_open(encoding, "UTF-8");
char buffer[size];
char *outptr = (char *) &buffer[0];
size_t insize = size;
size_t outsize = size;
iconv(cd, &(*str), &insize, &outptr, &outsize);
*str = buffer;
}
}
当我致电write_socket("NICK kiyoshi\r\n");
时
它给出了这个输出:encode: (14) msg:
并且从不连接到服务器。
char指针有什么问题?我想使用函数encode
。
答案 0 :(得分:3)
第二个版本失败,因为您将*str
指向encode
函数本地的缓冲区。函数返回时局部变量停止存在,除非它们标记为static
。因此,当代码到达int n = write(sockfd, msg, strlen(msg))
时,msg
是一个悬空指针。
一种解决方法是在buffer
函数中声明write_socket
,并将缓冲区传递给encode
。
答案 1 :(得分:0)
在函数编码中,变量缓冲区是局部变量,局部变量存储在堆栈中,在调用函数编码结束后,内容也消失了。