关于sprintf内存溢出

需要把各种类型的数据整合到同一个字符串中的时候,我想到了用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时要注意内存是否超出。

猜你喜欢

转载自blog.csdn.net/shihunyewu/article/details/70807870