c语言数组在内存中是怎么分配的?

比如inta[10]比如我的栈区的内存栈底是高地址,chari,a【10】是怎么分配的呢我是用vc6调试的,看来结果跟大家的一样,char[9]和i相差了3个地址,也就是... 比如int a[10]
比如我的栈区的内存栈底是高地址,char i,a【10】是怎么分配的呢

我是用vc6调试的,看来结果跟大家的一样,char[9]和i相差了3个地址,也就是他们之间空了两个地址,

我就想知道这是怎么回事,内存对齐的话为什么是空两个地址呢?

i和数组都是字符型的,为什么会牵扯到内存对齐的问题呢?
展开
 我来答
爱教育爱学习
高粉答主

2019-11-14 · 学而不思则罔,思而不学则殆
爱教育爱学习
采纳数:384 获赞数:112736

向TA提问 私信TA
展开全部

C语言使用的内存是虚拟内存。按照功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,不管是单一变量还是数组,其内存分配都是这样分的。

在栈区、静态数据区、堆区会有编译器负责分配、操作系统负责管理,程序员可以在堆区使用malloc()来动态分配堆内存的问题。

扩展资料

内存的分配和释放注意事项:

1、malloc和free是库函数,不是系统调用

2、malloc实际分配的内存可能会比请求的多---有些编译器分配时是以4字节为单元的

3、不能依赖于不同平台的下的malloc

4、当请求的动态内存无法满足时malloc返回的是NULL

5、当free的参数为NULL时,函数直接返回

参考资料来源:百度百科—数组

参考资料来源:百度百科—c语言

休闲娱乐达人天际
高能答主

2020-04-03 · 致力于休闲娱乐知识的解答,分享娱乐知识。
休闲娱乐达人天际
采纳数:1605 获赞数:396566

向TA提问 私信TA
展开全部

C语言使用的内存是虚拟内存。按照功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,不管是单一变量还是数组,其内存分配都是这样分的。

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。

扩展资料:

如果有过用其它语言编程的经历,那么想必会熟悉数组的概念。由于有了数组,可以用相同名字引用一系列变量,并用数字(索引)来识别它们。在许多场合,使用数组可以缩短和简化程序,因为可以利用索引值设计一个循环,高效处理多种情况。数组有上界和下界,数组的元素在上下界内是连续的。因为 Visual Basic对每一个索引值都分配空间,所以不要不切实际声明一个太大的数组。

此处数组是程序中声明的变量数组。它们不同于控件数组,控件数组是在设计时通过设置控件的 Index 属性规定的。变量数组总是连续的;与控件数组不同的是,不能从一个数组的中部加载或卸载数组元素。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小星星教育知识分享
高粉答主

2020-05-23 · 用教师的智慧点燃学生的智慧火花
小星星教育知识分享
采纳数:202 获赞数:67136

向TA提问 私信TA
展开全部

C语言中内存为分三类:栈区、堆区、静态数据区。

局部变量在栈上分配,函数调用前的栈指针,要和函数返回后的栈指针一样,否则就会出错。

void test(void)

{

char i,a[10];

printf("0x%x", &i);

printf("0x%x", a);

printf("0x%x", a+1);

printf("0x%x", a+2);

printf("0x%x", a+3);

}

扩展资料

c语言数组在内存分配

示例:

#include<stdio.h>

int main()

{

int a[4] = {11,12,13,14};

int b[4] = {21,22,23,24};

int *pa = &a;

int i = 0;

while(i<8)

{

i++;

printf("now *p value = %d and",*pa);

printf("p addr value = %d \n",pa);

pa++;

}

return 0;

}

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
吉祥二进制
高粉答主

推荐于2017-10-02 · 科技改变生活,生活改变科技。
吉祥二进制
采纳数:33926 获赞数:84581

向TA提问 私信TA
展开全部

使用C语言编程,实际上使用的内存只有一种——虚拟内存。根据功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,无论单一变量还是数组,其内存分配都是如此。其中,栈区、静态数据区、堆区都会有编译器负责分配、操作系统负责管理,程序员可以在堆区使用malloc()来动态分配堆内存。


1、栈区:一般每一个函数对应一个栈区,在编译原理中称为栈帧。比如下面的代码:

int main()
{
//定义一个有20个int元素的数组。此时数组a分配的虚拟内存称为栈区,有编译器自行分配。
    int a[20] = {0}; 
    return 0;
}


2、静态数据区:这实际上对应于生成的可执行文件的.data区段,因为这个区段在生成的可执行文件中,因此是“静态的”。比如下面的代码:

//定义一个20个int元素的全局数组,此时数组分配的虚拟内存称为静态数据区,有编译器自行分配。
int g_a[20]; 
int main() { return 0;}


3、堆区:堆区是最复杂的,有操作系统负责堆管理,但是当用C语言编译器生成一个可执行文件并且运行时,它会默认建立一些堆。拿Windows来说,每一程序运行,它会建立至少两个堆,一个是默认堆,一个是new堆。比如下面的代码:

int main()
{
    int *pa = (int*)malloc(sizeof(int)*20);//分配20个int元素大小的堆空间。
    return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
USSR_F1
2010-06-04 · TA获得超过358个赞
知道小有建树答主
回答量:96
采纳率:0%
帮助的人:103万
展开全部

关于多个变量一起定义的时候分配内存,是和具体的编译环境有关的。这里举VC++6.0和TC2.0为例,这段源代码是以.c扩展名保存的。#include <stdio.h>

int main()

{

 char i,a[10];

 printf("%x\t%x\t%x\n",&i,&a[0],&a[9]);

 return 0;

}

运行结果如图。左侧为TC2.0编译出来的,右侧为VC++6.0编译出来的。可以看出在栈区数组下标是向高地址方向增长的,这一点没有疑问。但是i和数组a的前后关系却有差异。在TC2.0中i位于低地址端而在VC++6.0中i却位于高地址端。

楼主如果有其他的编译环境也可以试试看。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(11)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式