今天在写程序的时候遇到了一个以前没有暴露出来的问题,问题如题目所示。下面写了一个小的测试程序,如下:
#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; }
从提示可以看出来,是内存那块出了问题。大体意思是 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问题——有待完美解决
原文地址:http://blog.csdn.net/fisherwan/article/details/45604473