strtol()错误地返回0

Vai*_*wal 1 c sockets string strtol

我正在研究一个项目,由于某种原因,我无法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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

我不明白为什么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;
}
Run Code Online (Sandbox Code Playgroud)

这是问题所在吗?谢谢.

pmg*_*pmg 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;
}
Run Code Online (Sandbox Code Playgroud)

temp是一个局部变量.当函数返回时它不再存在,留下*buffer指向一些无效的地方.

  • 你有3个选择:(1)做@iharob建议和malloc使用strdup的缓冲区,或(2)使`temp`静态(放弃线程安全),或(3)从调用代码传入缓冲区到`receivePacket` (2认同)