1. 程式人生 > >sscanf引發的Heap corruption detected error問題——有待完美解決

sscanf引發的Heap corruption detected error問題——有待完美解決

丟擲問題

今天在寫程式的時候遇到了一個以前沒有暴露出來的問題,問題如題目所示。下面寫了一個小的測試程式,如下:

#include <stdio.h>
#include <stdlib.h>

int main(){
	unsigned char *ua = (unsigned char*)malloc(sizeof(unsigned char) * 3);
	char line[40] = "177 100 88";
	sscanf(line, "%hhu %hhu %hhu", &ua[0], &ua[1], &ua[2]);
	printf("ua[3] = {%hhu, %hhu, %hhu}\n", ua[0], ua[1], ua[2]);
	if (ua){
		free(ua);
	}
	return 0;
}

在debug模式下會有如下錯誤:

從提示可以看出來,是記憶體那塊出了問題。大體意思是 C執行時檢測到應用程式在堆快取後寫入了記憶體。

解決問題方案

經過除錯,我發現,我在程式中分配的記憶體大小是3*sizeof(unsigned char)=3個位元組,但是用sscanf寫入的是6個位元組的記憶體大小,所以最後釋放記憶體的時候就會釋放6個字的大小,就有了上面的錯誤。


但是如果我用%c的格式寫入的時候就不會報這個錯誤了。這裡我想要的是0~255的值,而不是一個字元。把分配的記憶體大小改為6時就解決了。但總感覺這不是最好的解決辦法,希望有高手能指點出不對的地方。

最後完整程式碼如下:

#include <stdio.h>
#include <stdlib.h>

//想獲得ua的值在0~255之間,而不是一個字元
int main(){
	unsigned char *ua = (unsigned char*)malloc(sizeof(unsigned char) * 6);
	char line[40] = "177 100 88";
	sscanf(line, "%hhu %hhu %hhu", &ua[0], &ua[1], &ua[2]);
	printf("ua[3] = {%hhu, %hhu, %hhu}\n", ua[0], ua[1], ua[2]);
	if (ua){
		free(ua);
	}
	return 0;
}


相關推薦

sscanf引發Heap corruption detected error問題——有待完美解決

丟擲問題 今天在寫程式的時候遇到了一個以前沒有暴露出來的問題,問題如題目所示。下面寫了一個小的測試程式,如下: #include <stdio.h> #include <stdlib.h> int main(){ unsigned char *u

釋放記憶體出現HEAP CORRUPTION DETECTED錯誤

今天敲程式碼,出現了HEAP CORRUPTION DETECTED錯誤,本來指標分配記憶體,最後再釋放記憶體空間是天經地義的事情,竟然報錯,開始也摸不著頭腦,最後百度了一下,最終發現問題是,我分配了len長度的空間,我卻用到了len + 1的長度,釋放的時候就

VS2010中Debug模式下報"HEAP CORRUPTION DETECTED"錯誤

  今天寫程式碼時,在Debug模式下執行時突然報了這樣的錯誤:"HEAP CORRUPTION DETECTED",如下圖: 在Release模式下執行時報如下的錯誤: 我從表面上看,就知道是heap除了問題,下面是我的程式碼: ------------------

win10 no cuda-capable device is detected, error 38”問題解決方法

“win10 no cuda-capable device is detected, error 38”問題解決方法 error 解決方法 error 起初CUDA一切正常,然後某天突然發現error:cuda runtime error (

JNI DETECTED ERROR IN APPLICATION解決記錄

       最近遇到一個JNI的問題,同一套程式碼在Android4.4版本前的裝置上執行是OK的,但是在Android5.0之後的裝置上就會崩潰,檢視logcat發現報JNI DETECTED E

CDH中安裝Hue連線不上資料庫 Unexpected error. Unable to verify database connection 完美解決方案

在安裝CDH時,走到驗證資料庫連線部分時候,Hue總是驗證不過去,報錯為: Unexpected error. Unable to verify database connection。原因大都是因為缺少環境包所致。 我安裝的過程中分別使用過postgresql和mysql,都出現過相

完美解決 error C2220: warning treated as error - no object file generated

WinCE 6.0加入一個驅動後,編譯出現: error C2220: warning treated as error - no object file generated warning C4047: 'initializing' : 'UCHAR' differs in levels of

windows下scrapy安裝問題,以及Twisted安裝報錯(error: Microsoft Visual C++ 14.0 is required.)完美解決辦法

方法1(通常是失敗的) 1. 命令列執行: pip3 install scrapy 不管是網路問題也好,缺少相關的包也好,用這條命令安裝scrapy我就沒成功過。。。難受 方法2(成功) 手動安裝相關的包。 1. lxml安裝命令(沒問題): pip3 install lxml

JNI DETECTED ERROR IN APPLICATION:java.lang.SecurityExceptionandroid--解決JNI安全許可權異常

           好幾月了,部落格一直沒有動靜。因為專案太大,太忙了,終於可以空出幾天透透氣哩。        &nb

Error:SSL peer shut down incorrectly(完美解決)

前提條件 http://services.gradle.org/distributions/ 複製到瀏覽瀏覽器能開啟 下一步 開啟Android studio gradle version 配置檔案進行更改 Android Studio 預設配

完美解決 npm start 報錯 Error: Cannot find module 'XX' 的問題

問題: 在處理weex專案時,npm start 啟動不了本地服務 但是使用weex run ios 可以啟動iOS模擬器, npm start 報錯,缺少ws模組導致啟動不了localhost本地服務,無法瀏覽器除錯 完美解決 npm start 報錯 Error: Canno

轉! 完美解決 ERROR 1064 (42000): You have an error in your SQL syntax ... near …

在MySQL命令列使用sql語句進行建表時,MySQL 報錯,這個問題之前遇到過幾次,但是總是會因為疏忽又相遇,今天把這個問題寫出來,加深印象吧。 sql語句: CREATE TABLE 'lrs_audit_rule_package'( 'id' BIGINT(20

C++中Delete時堆錯誤(Heap Corruption)的原因

最近這三四天一直在跟一個bug做鬥爭:程式在執行過程中死掉,Output視窗顯示:         1.Windows has triggered a breakpoint in ***, This may be due to a corruption of th

Windows CIFS Browser Protocol Heap Corruption Vulnerability

An anonymous reporter has publicly announced a previously undisclosed vulnerability affecting the BROWSER protocol on Windows systems. In addi

JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception '

04-13 17:12:31.996 15662-15662/com.eno.xyzq.page.test A/art: art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: JNI Ca

完美解決 ERROR 1064 (42000): You have an error in your SQL syntax ... near …

在MySQL命令列使用sql語句進行建表時,MySQL 報錯,這個問題之前遇到過幾次,但是總是會因為疏忽又相遇,今天把這個問題寫出來,加深印象吧。 sql語句: CREATE TABLE 'lrs_audit_rule_package'( 'id'

呼叫dll時出現"Unhandled exception 堆已損壞(heap corruption)“異常解決方法

這是執行庫檔案時的錯誤。 解決方案:開啟專案屬性-->配置屬性-->C/C++-->程式碼生成-->執行時庫,改成多執行緒除錯DLL 編譯執行,然後可能會出項如下錯誤: fatal error C1189: #error : Building MFC application

堆破壞(Heap Corruption)和Gflags

什麼是Heap Corruption  堆破壞是記憶體破壞的一種,簡單來說就是由於程式的錯誤導致堆記憶體被意外改寫,典型的情況包括: 申請了N個Bytes的記憶體,卻試圖寫入> N個Byte

ubuntu啟動error:unknown filesystem完美解決方案

本人安裝的是win10+ubuntu16.04,硬碟直接安裝。ea error:unknown filesystem grub rescue> 研究了半天,才解決這個問題。先說說是怎麼回事。 安裝ubuntu時,啟動是用grub2進行啟動。我的win7在C盤, Ubu

完美解決android顯示gif

mov 並且 內存 hub 是不是 作者 pop -m data 今天是周5啊。糾結了一天。android顯示gif,沒該控件 網上找開源項目 找到個viewgif。該作者在各大站點都在推薦自己的項目。。。好吧。用下吧。。。。 結果呢: 圖片略微一大就 內存溢出了,並且