今天写程序的时候遇到了一个这样的问题,源程序比较复杂,替换一个小程序思考了一下:
#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]);
}
结果是这样的:
发现我们分配和寻址是按照相反的方向进行的,所以以后在处理堆上分配内存的操作时一定要小心。。。。