关于sprintf内存溢出

来源:互联网 发布:sdrsharp软件 编辑:程序博客网 时间:2024/05/29 16:39

需要把各种类型的数据整合到同一个字符串中的时候,我想到了用printf的近亲——sprintf,后来发现sprintf整合的结果总是不正确,下面上代码片段

char text[1];        /* print ip addresses and udp ports */        sprintf(text,"%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d",            ih->saddr.byte1,            ih->saddr.byte2,            ih->saddr.byte3,            ih->saddr.byte4,            sport,            ih->daddr.byte1,            ih->daddr.byte2,            ih->daddr.byte3,            ih->daddr.byte4,            dport);       ui->listWidget->addItem(text);       char sip[10],sp[10],dip[10],dp[5];       sprintf(sip,"%d.%d.%d.%d",               ih->saddr.byte1,               ih->saddr.byte2,               ih->saddr.byte3,               ih->saddr.byte4);       sprintf(dp,"%d",sport);       sprintf(dip,"%d.%d.%d.%d",               ih->daddr.byte1,               ih->daddr.byte2,               ih->daddr.byte3,               ih->daddr.byte4);        sprintf(dp,"%d",dport);       ui->tableWidget->insertRow(row);       ui->tableWidget->setItem(row,0,new QTableWidgetItem(text));       ui->tableWidget->setItem(row,1,new QTableWidgetItem(sport));       ui->tableWidget->setItem(row,3,new QTableWidgetItem(text));       ui->tableWidget->setItem(row,4,new QTableWidgetItem(dport));

后面的tableWidegt中的数据总是不正确的。

上网找原因发现是不安全的sprintf函数造成的,前面的字符数组空间开得太小了,但是sprintf在执行时不会考虑前面的字符串数组空间是否足够,它会自动地占用后续空间,这样就会影响后面的数据。后来我将所有的暂存字符串的数组都换成了一个,程序结果就正常了。

结论:使用sprintf时要注意内存是否超出。

0 0
原创粉丝点击