我正在进行一个项目,由于某些原因,我无法让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"我不明白为什么斯特罗托不能理解我给了它什么。
在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;
}问题就在这里吗?谢谢。
发布于 2014-12-28 09:45:06
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-28 09:36:52
问题是
char temp[10] = {0};是一个局部变量,它驻留在receivePacket函数的堆栈框架中,尝试使用strdup复制它
*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';https://stackoverflow.com/questions/27675224
复制相似问题