当前位置: 代码迷 >> Ruby/Rails >> sscanf引发的Heap corruption detected error有关问题——有待完美解决
  详细解决方案

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

热度:195   发布时间:2016-04-29 02:13:15.0
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;}


  相关解决方案