【 在 sqsl 的大作中提到: 】
: 上午请教各位不定长度数组的生成问题,用各位大拿推荐的malloc函数做成了,但是在
: 求数组长度的时候出现问题了。
: #include <stdio.h>
: ...................
主要是你没理解, C语言的指针变量。
L=sizeof(ret)/sizeof(ret[0]);
l=sizeof(*ret)/sizeof(ret[0]);
ret是一个指针, 因为你定义它是int*, 实际它是一个指向int类型的内存地址。
所以 sizeof(ret)实际是取得了一个指针占用的内存宽度, 指针的宽度, 实际上是和系统相关的,
32位的系统, 指针一般是32位, 我们现在家用PC常用的64位系统, 这个值是64位(8个字节)。
在C语言里面, 指针也可以当作数组首地址使用, ret[0], 就是把它当作整型数组的第一个元素,
因为ret是整型指针, 指向的第一个元素类型自然是整型, 所以,这里sizeof(ret[0]) 其实就是sizeof(int).
因为, 你的这个程序可能默认是64位平台的, 无论是int, 还是pointer的长度,都是64位的,
所以才有两次输出都是1.
如果, 你用编译器编译一个16位的程序, 比如,你用虚拟机安装一个DOS系统, 使用古老的c编译器,
指针和int长度就会不一样了。
数组的真实长度是存储长度除以每个元素单位长度,前一个值就是是你调用malloc 传给它的参数。
n*sizeof(int).
int arr[64];
int* p = arr;
虽然, p和arr所指的内存值是一样的, p[3] 和 arr[3] 都可以表示数组的第4个元素值,
但是, 语义是不一样的。 p[3]本质上是把一个指向int的指针越界使用了,但是, 因为指向的这片
地址, 恰恰是一个数组的空间, 而不会发生越界错误。
另外,就是这个sizeof语义差别, sizeof(arr)和 sizeof(p)是不一样的。前者是数组存储长度, 后者是
int 指针长度。
--
FROM 124.126.0.*