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;
}
时间: 2024-12-22 08:04:12

sscanf引发的Heap corruption detected error问题——有待完美解决的相关文章

Heap Corruption Detected Error

今日在释放内存是发生HEAP corruption Detected問題,纠结了半天.知道是释放的内存地址被改掉了造成的问题. 内存在申请时会前后各加4位fd.用来校验.如果内存被该改掉的话后面4位fd会变掉. 下面是转载资料: http://www.cppblog.com/kerlw/archive/2007/04/10/21604.aspx 今天写程序的时候到一个问题,调试的时候总是报错Heap corruption detected.一直没碰到过这样的问题,所以实在不知道如何下手.后来偶然

C语言错误: HEAP CORRUPTION DETECTED

程序源代码: //写文件两种方式(文本文件和二进制文件) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //文本写文件 int writeWord(const char *path,const char *pword){ int ERRO_MSG = 0; if (path == NULL) { ERRO_MSG = 1; printf(&q

HEAP CORRUPTION DETECTED

发生主要是由于这个问题给写入超出预分配的空间,注意检查越界情况 版权声明:本文博客原创文章,博客,未经同意,不得转载.

执行目标文件引发的问题:syntax error: word unexpected (expe...

今天不小心把一个目标文件当成了可执行文件放到开发板上进行执行,结果出现了这样一个问题:./hello_qt: line 1: syntax error: word unexpected (expecting ")"),因为以前没有碰到过这事,一时间有点蒙,就是一个简单的hello world按道理不会有问题才对.于是google了一下,原来是一个小小的-c编译选项搞得鬼.顺带也扩展学习总结了一下. arm和pc上执行目标文件的区别 一般来说,gcc -c选项编译出来的目标文件是不可执行

飞鸽传书 bind() error=10048错误的解决方法

提示  bind() 错误=10048 原因:其他程序占用飞鸽的 2425 端口 比如:飞秋也是使用2425端口 解决:用netstat命令查看是哪个进程占用了该端口 格式:netstat -ano | find "2425" 结果:  UDP    0.0.0.0:2425     *:*        1716 最后的1716就是占用2425进程的进程ID,看看是什么,可以结束的直接结束该进程,再打开飞鸽就可以了. 关于netstat命令可以输入命令 netstat /? 查看更多

error C2039: &#39;SetDefaultDllDirectories&#39;错误解决办法

使用VS2013+WDK8.1+Win7开发UMDF驱动,当使用了CComPtr类,包含了atlcomcli.h头文件却报错,错误如下: Error 3 error C2039: 'SetDefaultDllDirectories' : is not a member of '`global namespace'' 可是使用VS2012+WDK8.0+Win7却没有这个问题. 经过一番折腾终于找到了解决办法,在预定义中增加一项定义  _USING_V110_SDK71_ 具体见下图: error

安装CAD出现Error 1904.Module的解决方法

在安装AutoCAD2008时,安装过程中出现了一个小错误,虽然说不影响使用,也不影响功能,但还是需要把这个问题解决,今天就和大家分享解决这个问题的方法. 错误描述 会在安装过程中出现错误提示:Error 1904.Module C:Windowssystem32MacromedFlashFlash9.ocx failed to register.  HRESULT -2147220473. &amp;lt;img alt=&#8221;安装CAD出现Error 1904.Module的解

svn error:Subversion requires SQLite解决

在安装 subversion时候 #tar xvjf subversion-1.6.3.tar # ./configure --prefix=/data1/subversion --with-apxs=/data1/apache2/bin/apxs  --with-apr-util=/data1/apache2/bin/apu-1-config --with-apr=/data1/apache2/bin/apr-1-config 在以上编译过程中可能会出现 configure: error: S

win7下安装matlab后打开出错&ldquo;error starting desktop&rdquo;的解决办法

在matlab快捷图标上右键,选择"还原以前的版本"--"兼容性"选项卡,在"以兼容模式运行这个程序"前面打勾,并选择"windows vista",在下面的"特权等级"中,勾选"以管理员身份运行此程序".OK,到这里就解决了.[注意]是用"windows vista"系列的兼容模式,不要用XP兼容模式!   参考自:http://zhidao.baidu.com/l