在sprintf

时间:2017-10-08 00:55:32

标签: c

char* msg;
msg = (char*)malloc(snprintf(NULL, 0, "%s %s %s %s %s %s", 
    allClients[i]->IP, allClients[i]->hostName, allClients[i]->port, 
    allClients[i]->msgSentCount, allClients[i]->msgRecvCount, allClients[i]->status) + 1);
sprintf(msg, "%s %s %s %s %s %s", 
    allClients[i]->IP, allClients[i]->hostName, allClients[i]->port, 
    allClients[i]->msgSentCount, allClients[i]->msgRecvCount, allClients[i]->status);

printf("%s\n", "here");
eachClientData[i+1] = msg;
printf("list msg: %s\n", msg);
free(msg);

我在sprintf()中遇到seg fault 11导致下一个printf永远不会被执行。我对malloc做错了吗?我可以添加到msg有任何上限吗?

注意: snprintf执行得很好,因为我执行了后面的printf。另外,如果需要,我可以给你我试图连接的每个变量的大小。

2 个答案:

答案 0 :(得分:1)

由于您已将intstring输入传递到snprintf()sprintf(),因此您需要将"%s %s %s %s %s %s"更改为{{1为了正确处理"%s %s %d %d %d %s"值。

答案 1 :(得分:1)

int(以及其他一些变量)看起来像整数。您无法使用allClients[i]->port打印它们;这是为了字符串。会发生的是%s格式使%s读取sprintf包含的地址后面的内存,0x000010e2,为0x10e2 = 4322,然后继续从那里读取,直到找到int,因为它认为它正在处理字符串。这是未定义的行为。

改为使用’\0’,如果是长整数,则使用%d等。