码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-09 22:11:11      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:sscanf   heap corruption   

抛出问题

今天在写程序的时候遇到了一个以前没有暴露出来的问题,问题如题目所示。下面写了一个小的测试程序,如下:

#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问题——有待完美解决

标签:sscanf   heap corruption   

原文地址:http://blog.csdn.net/fisherwan/article/details/45604473

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!