C语法中的内存分配
Posted SmartGame
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语法中的内存分配相关的知识,希望对你有一定的参考价值。
关于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;
}
通过第二段程序我们可以发现,在堆上分配的空间即使在是在被调函数上分配的也可以在主调函数中使用,是不会被析构掉的;这块内存只能自己手工释放的;
可以在被调函数和主函数上使用的空间,除了以上说的,还有全局变量,宏定义(注:宏定义不是分配空间,只是进行了宏替换,编译器会将宏放进一个转换表里,对其进行替换);今天就这么多吧!
以上是关于C语法中的内存分配的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的生命周期:变量逃逸分析 —— go编译器自动决定变量的内存分配方式(堆还是栈),提高程序运行效率