1

我正在做一个项目,由于某种原因,我无法strtol()将 a 转换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;
}

这是问题所在吗?谢谢。

4

2 回答 2

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指向某个无效的地方。

于 2014-12-28T09:45:06.993 回答
4

问题是

char temp[10] = {0};

是一个局部变量,它存在于receivePacket函数的栈帧中,尝试用strduplike复制它

*buffer = strdup(temp);

receivePacket函数返回数据时,temp将不存在记录器。

也不要忘记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';
于 2014-12-28T09:36:52.327 回答