今天写程序的时候遇到了一个这样的问题,源程序比较复杂,替换一个小程序思考了一下:#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
void main()
{
int *a, n = 10, i;
if((a = (int*)malloc(n*sizeof(int)))==NULL)
{
printf("the memory is in lack");
exit(0);
}
for(i = 0; i<n; i++)
a[i] = i+1;
for(i = 0; i<n; i++)
printf("%d ",a[i]);
free(a);
}这段代码就是简单的动态申请一维数组,然后数组赋值那部分改一下:
while(i < n)
*a++ = i++;最后再打印,发现结果不对,为什么呢?思考了一下,好像在堆中分配内存是向相反方向增加的,所以我们打印函数写的不对
验证一下看看:
while(i < n)
{
*a = i++;
printf("%p\n",a);
a++;
}//栈中分配的特殊性
a--;打印出来:
printf("\n");
for(i = 0; i<n; i++)
{
printf("%p\n",&a[i]);
printf("%d ",a[i]);
}结果是这样的:
发现我们分配和寻址是按照相反的方向进行的,所以以后在处理堆上分配内存的操作时一定要小心。。。。
本文探讨了在C语言中使用动态内存分配时遇到的问题,特别是关于堆内存的分配方向及其对数组元素寻址的影响。通过修改数组赋值方式并观察结果,作者发现了堆内存的分配特性,并给出了相应的解释。
2712

被折叠的 条评论
为什么被折叠?



