动态创建数组的问题
我做了试验性的编程如下。我动态创建了二维数组p,每一维的大小分别是1和4,但是给第一维赋值时,为什么也能够将具有3个元素的a1赋给*p呢,输出就是字符串 "ab "?
难道动态创建的数组不能够进行越界的判断吗?
请各位帮忙!
unsigned char a1[3]= "ab ";
unsigned char a2[3]= "cd ";
unsigned char** p;
p=(unsigned char**)malloc(sizeof(unsigned char*)*2);
*p=(unsigned char*)malloc(sizeof(unsigned char)*1);
*(p+1)=(unsigned char*)malloc(sizeof(unsigned char)*4);
*p=&a1[0];
[解决办法]
你创建的不是数组啊,
*p=(unsigned char*)malloc(sizeof(unsigned char)*1);
这句代码分配的内存被下面的付值覆盖:
*p=&a1[0];
于是你的输出当然是 "ab ",你上面用malloc()分配的内存直接让你丢掉了
没有听说过动态创建数组的说法,所有的数据类型都是编译器在编译期维护的,在运行期间就没有了数据类型信息了,数组也一样,所以你说的越界检查在运行期间编译器已经无能为力,只能靠你自己来。当然,除非你创建一个包含自身类型信息的新类型,那才可能动态的获得类型信息,这个要在面向对象的语言中才好实现,比如C++
[解决办法]
c中,出于效率的问题不检查是否越界(即范围检查)。
因为如果支持范围检查,那样在编译器生成目标代码时就会插入范围检查的代码,我们知道对于每次的访问,这样就必须执行那一段范围检查的代码,效率必然会降低。
你的代码,有危险,那就是在动态获得内存之后,又将指针指向别处(*p=&a1[0];)
原来分配的内存你就无法找到了,也就是内存泄漏了。
你可能以为这个赋值语句是将数组内容拷贝到指针指向的内存中去吧?
呵呵。