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。另外,如果需要,我可以给你我试图连接的每个变量的大小。
答案 0 :(得分:1)
由于您已将int
和string
输入传递到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
等。