關於sprintf記憶體溢位

2021-07-31 05:18:01 字數 1365 閱讀 4342

需要把各種型別的資料整合到同乙個字串中的時候,我想到了用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時要注意記憶體是否超出。

關於記憶體溢位

記憶體溢位是指應用系統中存在無法 的記憶體或使用的記憶體過多,最終使得程式執行要用到的記憶體大於虛擬機器能提供的最大記憶體。1 記憶體中載入的資料太大 2 集合類中有對物件的引用,使用後未清空 3 中存在死迴圈或迴圈產生過多重複的物件實體 4 使用的第三方軟體中的bug 5 啟動引數記憶體值設定的過...

Android關於Bitmap記憶體溢位的一點想法

對於任何手機來說,記憶體管理至關重要,不管是android還是iphone,在程式中及時 資源,可以防止記憶體的溢位.例如 for int i 0 i list.size i 這裡對於bitmap就沒有很好 和利用,因為是迴圈,所以bitmap就可以放到外部,讓程式重複利用,而不需要每次都建立乙個新...

關於記憶體洩漏和記憶體溢位的問題

很早就想寫這篇部落格,一直沒有時間,開篇一句話概括兩者的關係 記憶體洩漏導致記憶體溢位 那就先說一下記憶體洩漏吧,某乙個位置的記憶體洩漏,或者說導致一次記憶體洩漏沒有什麼大的影響,但是累積起來多了,那就造成了oom記憶體溢位的錯誤了,那麼什麼是記憶體洩漏呢換句話說什麼能導致記憶體洩漏呢,怎樣避免記憶...