首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >strtol()错误返回0

strtol()错误返回0
EN

Stack Overflow用户
提问于 2014-12-28 09:35:03
回答 2查看 866关注 0票数 1

我正在进行一个项目,由于某些原因,我无法让strtol()char *转换为整数。我有这样的代码:

代码语言:javascript
运行
复制
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返回垃圾:

代码语言:javascript
运行
复制
(gdb) print buffer
$1 = 0xbefff648 "1"
(gdb) print times
$2 = 0
(gdb) print temp
$3 = 0xbefff648 "H\366\377\276(\207"

我不明白为什么斯特罗托不能理解我给了它什么。

receivePacket

代码语言:javascript
运行
复制
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;
}

问题就在这里吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-28 09:45:06

代码语言:javascript
运行
复制
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将指向某个无效位置。

票数 7
EN

Stack Overflow用户

发布于 2014-12-28 09:36:52

问题是

代码语言:javascript
运行
复制
char temp[10] = {0};

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

代码语言:javascript
运行
复制
*buffer = strdup(temp);

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

另外,别忘了在free(buffer)之后使用strtol

还有一件事,要么改变

代码语言:javascript
运行
复制
char temp[10] = {0};

代码语言:javascript
运行
复制
char temp[11] = {0};

代码语言:javascript
运行
复制
n = recvfrom(*sock, temp, 10, 0, (struct sockaddr *) &cliAddr, &clilen);

代码语言:javascript
运行
复制
n = recvfrom(*sock, temp, 9, 0, (struct sockaddr *) &cliAddr, &clilen);

否则,您可能会覆盖尾随的'\0',在这种情况下,strdup无法工作,strtol也不起作用。

您还可以删除temp[10] = {0};初始化,然后在recvfrom之后添加

代码语言:javascript
运行
复制
temp[n] = '\0';
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27675224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档