c程序中存储空间布局

一、正文段。可执行程序在存储空间的的副本,cpu执行的机器指令部分。

二、初始化的数据段。它包含明确地赋初值的变量。如: int a = 1; 此变量放于数据段。

三、未初始化的数据段。 内核将此段中的数据初始化为0或者空指针。出现在任何函数外的c声明 ,long sum[1000];此变量存放在非初始化数据段中。

四、栈。每次函数调用时,其返回地址以及调用者的环境信息都存放在栈中。最近被调用的函数在栈上为其自动和临时变量分配存储空间。每次函数调用结束后,系统会自动收回内存。(见下面的程序1说明)

五、通常在堆中进行动态存储分配。每次函数被调用结束后,系统不会收回内存。如下图所示:


                           

我们首先说一下,栈的应用。

程序1:

#include <stdio.h>
#include <stdlib.h>

char *GetString(void)
{
	char p[] = "Hello, World";
	return p;
}

int main(void)
{
	char *str = NULL;
	str = GetString();	
	printf("%s\n", str);
}
上面的程序例子,是错误的。因为 char p[] = "Hello, World"; 数组占有的空间在函数GetString()调用后,将会把收回,所以是错误的。一般编译器会报出这样的错误, warning: function returns address of local variable, 因此说,千万不能用return语句返回指向“栈内存”的指针。

然后我再说一下堆的应用吧。

程序二

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char *GetString(int num)
{
	char *p = (char *)malloc(sizeof(char)* num);
	return p;
}


int main(void)
{
	char *str = NULL;
	str = GetString(100);
	strcpy(str, "Hello, World");
	printf("%s\n", str);
	free(str);
}

在程序二中,GetString()申请空间,函数被调用结束后,不会被释放。故空间可以被使用。 因此可以说,用return语句可以返回指向“堆内存”的指针。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_807315755

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值