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
}
整型数组每个元素在内存中连续存储,每个整型元素存储方式取决于机器硬件。\x0d\x0a一、数组元素都是连续存储的,地址依次从低到高。\x0d\x0a如字符数组 char a[10]\x0d\x0a其元素有10个,为a[0]到a[9], 地址连续。 如果a的起始地址为0x1234,那么后续地址依次为0x1235, 0x1235...0x123D。\x0d\x0a二、每个元素具体存储方式,取决于CPU。 有两种:\x0d\x0a1、小端(Little Endian):\x0d\x0a将低序字节存储在起始地址(低位编址), 地址低位存储值的低位,地址高位存储值的高位 。\x0d\x0a目前大多数CPU是按照这种方式存储的,包括intel和移动端最常见的arm。\x0d\x0a比如4字节整型值为0x12345678的情况,那么在内存中会存储为:\x0d\x0a\x0d\x0a0x78 0x56 0x34 0x12\x0d\x0a2、大端(Big Endian):\x0d\x0a与小端相反, 将高序字节存储在起始地址(高位编址),地址低位存储值的高位,地址高位存储值的低位。\x0d\x0a之前的例子在大端情况下存储为:\x0d\x0a0x12 0x34 0x56 0x78可以。。
例子如下:
# include <stdio.h>
# include <malloc.h>
void main(void)
{
int len,i, *p
printf("输入要存放元素的个数:")
scanf("%d", &len)//输入长度构造动态一维数组
p = (int *)malloc(sizeof(int)*5)
for(i=0i<len++i)
scanf("%d",(p+i))// p+i等同于&p[i]
// 将动态一维数组p的长度增加至6,并将第6个元素赋值为100
realloc(p,sizeof(int)*6)//realloc重新增加或减少一维数组的长度;
p[5] = 99
printf("输出内容:\n")
for(i=0i<=len++i)
printf("%-5d", p[i])//p[i]等同于*(p+i)
printf("\n")
第一个是在栈上分配:就是在函数调用栈所在的那个栈上
第二个是在“堆区”分配。