为什么使用char指针指针的函数不起作用?

时间:2016-05-24 00:23:21

标签: c function pointers char

我陷入困境,无法弄清楚为什么这个功能代码无法正常工作。代码来自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

2 个答案:

答案 0 :(得分:3)

第二个版本失败,因为您将*str指向encode函数本地的缓冲区。函数返回时局部变量停止存在,除非它们标记为static。因此,当代码到达int n = write(sockfd, msg, strlen(msg))时,msg是一个悬空指针。

一种解决方法是在buffer函数中声明write_socket,并将缓冲区传递给encode

答案 1 :(得分:0)

在函数编码中,变量缓冲区是局部变量,局部变量存储在堆栈中,在调用函数编码结束后,内容也消失了。