空数组的问题空数组因该是不占用空间的吧,那么空数组名的值到底是多少呢?一开始我认为是随机值或者是&ch2
空数组的问题 空数组因该是不占用空间的吧, 那么空数组名的值到底是多少呢? 一开始我认为是随机值或者是&ch2的值,跑了很多遍下面这个程序, p的值都是在&ch1 和 &ch2 之间。求解释
int main(void) { char ch1 = 0x12; char *p[] = {}; char ch2 = 0x34; printf("%#x\n", &ch1); printf("%#x\n", p); printf("%#x\n", &ch2); return 0; }运行结果
0xbf8648af 0xbf8648ac 0xbf8648ab C 空数组
[解决办法] 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
[解决办法] char * p[] = {};
这句话这句话其实声明了两个变量,一个是char ** p,一个是匿名数组,然后把匿名数组的首地址赋值给p。
从逻辑上讲这个数组内容为空,应该不占空间,但一般编译器都不会分配“0”个空间,当需要分配“0个空间”时,编译器在实现时会分配1个空间的存在给这个变量。
此外,你用的是16位编译器?
引用: p 换成 &p[0] 就可以看到你想要的结果了. p == &p[0]永远成立。
[解决办法] 空数组因该是不占用空间的吧,
变量的定义就是为变量分配了空间,
[解决办法] 用gcc试了试,发现我的猜测并不正确,正如楼主的代码那样,p与&ch1之间差了3,这个数值并不足以存放一个指针。
此外,改一下p的类型后发现,p与&ch1之间的差值总是为sizeof(p[0]) - 1。
而当改成1个元素的数组之后,类型为char p[]和short p[]时,p与&ch1之间都只差sizeof(p[0]),而int p[]和char * p[]类型则差值为sizeof(p[0])*2。
[解决办法] 引用:
char * p[] = {}; 这句话这句话其实声明了两个变量,一个是char ** p,一个是匿名数组,然后把匿名数组的首地址赋值给p。 从逻辑上讲这个数组内容为空,应该不占空间,但一般编译器都不会分配“0”个空间,当需要分配“0个空间”时,编译器在实现时会分配1个空间的存在给这个变量。 此外,你用的是16位编译器?Quote: 引用: p 换成 &p[0] 就可以看到你想要的结果了. p == &p[0]永远成立。 照你那么说, 岂不是 int a[] = { 1, 2, 3} 是不是也分配了两个变量, 一个 int*, 一个 int 数组, 然后把数组地址给 a ? 既然是变量, 就得对应内存吧, 你能把这两个变量的内存地址给出来吗?
[解决办法] 我只是在猜测为什么p与&ch1之间差了3,但很明显,我猜错了。
虽然在参数声明时char*[]等同于char**,但变量声明时二者是有区别的。好久不用这种东西,都快忘光了。
[解决办法] 在结构体中。即使结构体中没有任何一个元素。 但是结构体的大小,仍然最小是1字节。 编译器在实现默认,结构体里至少有一个char型 。不过知道 数组是不是也一样的道理。
[解决办法] http://blog.csdn.net/tenfyguo/article/details/6415672
[解决办法] 为什么在vc6上 char *p[] = {};编译不过?
[解决办法] 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
------------------------赵老师,我可是在很多地方看到你的这个建议哦!!,不过挺好的