4
回答
c语言中,数组和地址的关系
华为云数据库免费试用   

从输出的地址结果来看,这2组数组的地址差20,也就是相差32位字节,怎么感觉不对劲啊

<无标签>
举报
天王盖地虎626
发帖于3个月前 4回/420阅

在 DEV-C++5.4.0的环境下,测试“C语言中数组与地址的关系”,结果显示,连续声明的 int、long、 float、 short、 和 char 数组,长度均为 10,其对应的地址,与要求的空间,均在预料之中。 楼主的测试,是在一个虚拟(virtual machine)环境里进行,是否虚拟机对数组的内存分配另有安排?我也纳闷。

测试代码如下:

#include <stdio.h>
int main(){
	int count[10];
	long distances[10];
	float salaries[10];
	short s[10];
	char c[10];
	
	printf("int : %d, long:  %d, float:  %d, short:  %d, char: %d\n",
	sizeof(int), sizeof(long), sizeof(float),sizeof(short), sizeof(char));
	printf("Address of the array count is :%x\n", count);
	printf("Address of the array distances is :%x\n", distances);
	printf("Address of the array salaries is :%x\n",salaries);
	printf("Address of the s is :%x\n", s);
	printf("Address of the array c is :%x\n", c);
}
int : 4, long:  4, float:  4, short:  2, char: 1
Address of the array count is :28fef8
Address of the array distances is :28fed0
Address of the array salaries is :28fea8
Address of the s is :28fe94
Address of the array c is :28fe8a

数组类型 数组名称 数组地址

所占空间

16进制/10进制

int [10] count 28fef8  28/40
long [10] distances 28fed0 28/40
float [10] salaries 28fea8 28/40
short [10] s 28fe94 14/20
char [10] c 28fe8a a/10

 

引用来自“tcxu”的评论

在 DEV-C++5.4.0的环境下,测试“C语言中数组与地址的关系”,结果显示,连续声明的 int、long、 float、 short、 和 char 数组,长度均为 10,其对应的地址,与要求的空间,均在预料之中。 楼主的测试,是在一个虚拟(virtual machine)环境里进行,是否虚拟机对数组的内存分配另有安排?我也纳闷。

测试代码如下:

#include <stdio.h>
int main(){
	int count[10];
	long distances[10];
	float salaries[10];
	short s[10];
	char c[10];
	
	printf("int : %d, long:  %d, float:  %d, short:  %d, char: %d\n",
	sizeof(int), sizeof(long), sizeof(float),sizeof(short), sizeof(char));
	printf("Address of the array count is :%x\n", count);
	printf("Address of the array distances is :%x\n", distances);
	printf("Address of the array salaries is :%x\n",salaries);
	printf("Address of the s is :%x\n", s);
	printf("Address of the array c is :%x\n", c);
}
int : 4, long:  4, float:  4, short:  2, char: 1
Address of the array count is :28fef8
Address of the array distances is :28fed0
Address of the array salaries is :28fea8
Address of the s is :28fe94
Address of the array c is :28fe8a

数组类型 数组名称 数组地址

所占空间

16进制/10进制

int [10] count 28fef8  28/40
long [10] distances 28fed0 28/40
float [10] salaries 28fea8 28/40
short [10] s 28fe94 14/20
char [10] c 28fe8a a/10

 

我的是虚拟机下运行的,修改了下程序,再运行下,这结果,让我看不懂


#include <stdio.h>

int main(void)
 {
   int count10;
   float salaries10;
   long distances10;
printf("int : %lu, long:  %lu, float:  %lu\n",
    sizeof(int), sizeof(long), sizeof(float));   
printf("Address of the array count     is %p\n", count);
printf("Address of the array salaries  is %p\n", salaries);
printf("Address of the array distances is %p\n", distances);
 

   return 1;
}
gcc ARRAYADD.C -o arrayadd 编译
./arrayadd  运行
结果:
int : 4, long:  8, float:  4
Address of the array count     is 0x7ffdab856b80
Address of the array salaries  is 0x7ffdab856bb0
Address of the array distances is 0x7ffdab856be0
 

使用你的代码,在 DEV-C++环境下运行。输出:

int : 4, long:  4, float:  4
Address of the array count     is 0028FEF8
Address of the array salaries  is 0028FED0
Address of the array distances is 0028FEA8

将所得数据与你的虚拟机数据相比如下:

  虚拟机 DEV-C++
长型占空间 8字节 4字节
数组地址随声明顺序 递增 递减
数组地址间距 48字节 40字节

与诸位探讨的结论:

  1. DEV-C++对连续声明的数组,都预留了应有的空间,并且以栈 stack 的存储形式, 连续地安排。
  2. 与 DEV-C++不同,虚拟机为long型变量安排了8个字节的空间。
  3. 与 DEV-C++ 分配数组空间不同,似乎以堆 heap 的形式(?),分别为每个数组预留了应有的空间。
--- 共有 5 条评论 ---
tcxu 回复 @快乐的一只小青蛙 : 更确切地说,我的操作系统是win7,32bit. 3个月前 回复
天王盖地虎626 回复 @tcxu :是的,64位 3个月前 回复
tcxu 回复 @快乐的一只小青蛙 : 那么,楼主的虚拟机一定是 64bit的啰? 3个月前 回复
tcxu 回复 @快乐的一只小青蛙 : 那么,我的 DEV-C++就是32bit的。 3个月前 回复
快乐的一只小青蛙long的size为8无关虚拟机,long的在32bit下为4,64bit下为8 3个月前 回复
顶部