首页 > 代码库 > VLine[-1]=VLine[width]=128 数组的负一地址代表啥

VLine[-1]=VLine[width]=128 数组的负一地址代表啥

最近在调算法是,涉及到rgb转yuv数据的一个函数,出现了这种常见错误:如下

 unsigned char *VLine = (new unsigned char[width+2]);//+1;  
 //ULine[-1]=ULine[width]=128;   //-1的16位二进制表示:1111 1111 1111 1111
 此时uline mem指向0xFFFF这个地址。
delet []VLine;

结果.如果住掉赋值128的那一行,正确通过没错,要是不住掉就会产生heap堆内存错误信息;

问题原因:

1.是有关数组-1,-2,-3,-4的地址代表分配头信息,不然free(x)可以不要知道大小就可以释放的原因;

2.vline指向动态分配后的地址,然而又对其进行赋值,造成vline指向了一个常量空间地址,,只读data段上,而不是堆区域了,常量地址的分配内存,只能在程序退出后才能自动释放。

:指向的是个定长且固定内容的指针,不存在变化,所以不用释放。而且,你也无法释放,等程序结束自动释放

 

解决办法:

1.

point = new char[5];
point = "fda";//这句话注销了就对了 不知道为什么
--------------------------------------------------------------------------
point = "fda"
应改为:
memmove( point, "fda", 3);
或:
strcpy( point, "fda");
在最前面加上:
#include "string.h"
2.point[0] = ‘f‘; point[1] = ‘d‘; point[2] = ‘a‘;
附上相关资料:
http://dearymz.blog.163.com/blog/static/205657420062271155250/
http://bbs.csdn.net/topics/390359048
http://zhidao.baidu.com/link?url=o9US18FIs-JuvBOQgNTL1diMNfiyRoGvOGHMlKoDZCGMu1UApWeIVuy-8UO4MV-0Jlryiz05jaKvK4RQfDRh0a
http://wenku.baidu.com/link?url=KrHpusbOUWu25UK0WbNdP3ZDsBT_jKe4nptbEu8h6cbULhVVHB_R5RLm8zl_oSE6-by5QG3jay9-o8lQOVDDP6Gq3-oNvuCJu2HATkz8Er7 delet 常犯的几种错误
http://bbs.pediy.com/showthread.php?t=176091 delet 出问题

http://bbs.csdn.net/topics/300170474 a[-1]问题

http://blog.csdn.net/daniel_ice/article/details/6857019 汇编解释数组和取数组