一段关于变量与内存空间占用的对话

  老丁-厦门(43515273) 2012/2/12 4:45:54
#include <iostream>
#include <iomanip>
using namespace std;
void copystr(char *str1,char *str2)
{
 for(;*str2!='\0';str1++,str2++)
  *str1=*str2;
 *str1='\0';
}
void main()
{
 char a[10];//如果把这句换成:char *a="ghi";就会发生错误,为什么?
 char *b="abc";
 copystr(a,b);
 cout<<"a="<<a<<endl;
}

厦门英智-黄双全(962017)  10:33:56
局部变量都是分配在栈里面,比如定义char * a,的栈中占用一个指针的大小
char a[10],占用10个字节的大小,有些系统为了对齐,会占用12个字节的大小
栈中的内容是可以改变的
不过,char * a="ghi";其实是分成两部份,char * a和"ghi",其中char *a在栈中,占用了四个字节,而"ghi"则是是分配在代码区里面,也就是和程序代码是在一块区里面
所以不能够改变它
char * a= "ghi";
char * b="abc";
a= b; 是正确定的,因为a是在栈里面,改变的是a这个指针四个字节的内容
copy b to a 是错误的,因为这个动作是要用abc来覆盖ghi这三个字符,而ghi这三个字符是在代码区里面
内存中,分为四种,一种是代码空间,一种是数据空间(包括全局变量,局变量(栈),还有就是堆空间)
代码空间是不允许改变的,受系统何护,而数据空间,则是都可以改变的
 
郭志顺(513367429)  10:41:02
char a[] = "hello";
char a[10] = "hello";
这两个都保存在哪里啊?
 
老丁-厦门(43515273)  10:41:38
char a[] = "hello";
char a[10] = "hello";
这两个都保存在哪里啊?
保存在堆里
 
厦门英智-黄双全(962017)  10:42:36
char a[]占用了6个字节空间,如果是局部变量,则分配在栈里面,"hello"占用6个字节,藏在代码里面,在程序运行的时候,有个初始化动作,会"hello"这个位置的内容,拷到char a[]这个位置去
会占用两份空间,一份是占用程序空间,一份是占用数据空间,只是编译器自动加了一个拷贝动作进去
 
老丁-厦门(43515273)  10:44:14
堆栈,老和单片机的区分不开,单片机的堆栈就是这里的栈,惯性思维
 
厦门英智-黄双全(962017)  10:44:23
char a[10]占用了10字节的数据空间,"hello"占用了6个字节的代码空间
 
郭志顺(513367429)  10:45:49
那是不是还有拷贝行为
 
厦门英智-黄双全(962017)  10:47:23
数据空间的占用,根据你定义方式的不同,而不同,可能会存储在“全局变量(全局空间,程序编译完后,大小是固定的),局变量(栈)”两种情况,如果需要存堆中,则需要调用malloc手动分配内存,再对它进行赋值
是的,是还有拷贝行为
所有对变量的初始化,都有一个拷贝行为
 
厦门英智-黄双全(962017)  10:48:33
变量定义,在程序运行过程中,分定义和赋值过程,初始化,就是把定义和赋值写在一行代码中而己
 
郭志顺(513367429)  10:49:00
嗯,明白了,非常的透彻
这些知识是属于编译原理里面的吗?
 
厦门英智-黄双全(962017)  10:52:10
有部份编译原理的知识,也有系统及硬件体系结构相关的知识
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值