关于c中的内存分配问题,这个问题怎么说好呢,我感觉还是和内存四区挂上了钩,在主调函数中栈区上分配的内存空间是可以在被调函数使用的:
例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *distribution(char *a)
{
char b[64];//被调函数中在栈区上分配一个64字节的一维数组
printf("%s\n",a);//打印字符串为 aaabbb ,即被调函数可以使用主调函数分配的空间
memcpy(b,a,strlen(a));//将a中的字符串copy到b中
printf("%s\n",b)://打印字符串为 aaabbb
return b;//将被调函数的头地址返回出去
}
int main()
{
char a[64] = {0};//在栈区上分配一个64字节的一维数组
char *b = NULL;
strcpy(a,"aaabbb");//将字符串复制到a中
b = distribution(a);//a 即是一维数组的头地址,可以通过指针指向它的头地址
//通过b接受函数返回的地址
printf("%s\n",b);//打印的字符串为一堆乱码
system("pause");
return 0;
}
通过上面这个例子我们发现在栈区上:主调函数分配的空间可以在被调函数上使用,而被调函数上分配的空间无法在主调函数上使用,因为当其运行完之后会被析构掉,分配的空间也被析构掉了,但是地址是不会变的,但是这时这个地址上是没有分配内存空间的;所以打印出来的是一堆乱码;
但是如果在堆区上就不一样了;
char *distribution()
{
char *a = NULL;
a = (char *)malloc(sizeof(char) * 64);
strcpy(a,"aaabbb");//将字符串复制到a中
return a;
}
int main()
{
int *a = NULL;
a = distribution();
printf("%s\n",a);//打印字符串为 aaabbb
system("pause");
return 0;
}
通过第二段程序我们可以发现,在堆上分配的空间即使在是在被调函数上分配的也可以在主调函数中使用,是不会被析构掉的;这块内存只能自己手工释放的;
可以在被调函数和主函数上使用的空间,除了以上说的,还有全局变量,宏定义(注:宏定义不是分配空间,只是进行了宏替换,编译器会将宏放进一个转换表里,对其进行替换);今天就这么多吧!