strtol()错误地返回0

时间:2014-12-28 09:35:04

标签: c string sockets strtol

我正在处理一个项目,由于某种原因,我无法让strtol()char *转换为整数。我有这段代码:

int main(int argc, char *argv[]) {
    //socket initialization code...

    struct sockaddr_in addr;
    char *buffer;
    receivePacket(&sock, &buffer, &addr); //function i have written to receive a packet
    char *temp;
    int times = (int) strtol(buffer, &temp, 10);
}

当我运行它时,时间总是最终为0,而​​temp返回垃圾:

(gdb) print buffer
$1 = 0xbefff648 "1"
(gdb) print times
$2 = 0
(gdb) print temp
$3 = 0xbefff648 "H\366\377\276(\207"

我不明白为什么strtol无法理解我所给予的东西。

receivePacket

void receivePacket(int *sock, char **buffer, long *tx, struct sockaddr_in *cliaddr) {
    //socket related code, initializations, etc.
    char temp[10] = { 0 };
    n = recvfrom(*sock, temp, 10, 0, (struct sockaddr *) &cliAddr, &clilen);
    *buffer = temp;
}

这是问题所在吗?感谢。

2 个答案:

答案 0 :(得分:7)

void receivePacket(int *sock, char **buffer, long *tx, struct sockaddr_in *cliaddr) {
    //socket related code, initializations, etc.
    char temp[10] = { 0 };
    n = recvfrom(*sock, temp, 10, 0, (struct sockaddr *) &cliAddr, &clilen);
    *buffer = temp;
}

temp是一个局部变量。函数返回时它不再存在,使*buffer指向某个无效的位置。

答案 1 :(得分:4)

问题是

char temp[10] = {0};

是一个局部变量,它位于receivePacket函数的堆栈框架中,尝试使用strdup复制它

*buffer = strdup(temp);

receivePacket函数返回temp中的数据时,不存在loger。

free(buffer)之后也不要忘记strtol

还有一件事,要么改变

char temp[10] = {0};

char temp[11] = {0};

n = recvfrom(*sock, temp, 10, 0, (struct sockaddr *) &cliAddr, &clilen);

n = recvfrom(*sock, temp, 9, 0, (struct sockaddr *) &cliAddr, &clilen);

因为否则您可能会覆盖尾随的'\0',在这种情况下strdup无效,strtol也不会。

您还可以删除temp[10] = {0};初始化,而不是在recvfrom添加

之后
temp[n] = '\0';