我正在处理一个项目,由于某种原因,我无法让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;
}
这是问题所在吗?感谢。
答案 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';