老丁-厦门(43515273) 2012/2/12 4:45:54
#include <iostream>
#include <iomanip>
using namespace std;
#include <iostream>
#include <iomanip>
using namespace std;
void copystr(char *str1,char *str2)
{
for(;*str2!='\0';str1++,str2++)
*str1=*str2;
*str1='\0';
}
{
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;
}
{
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这三个字符是在代码区里面
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";
这两个都保存在哪里啊?
char a[] = "hello";
char a[10] = "hello";
这两个都保存在哪里啊?
老丁-厦门(43515273) 10:41:38
char a[] = "hello";
char a[10] = "hello";
这两个都保存在哪里啊?
保存在堆里
char a[] = "hello";
char a[10] = "hello";
这两个都保存在哪里啊?
保存在堆里
厦门英智-黄双全(962017) 10:42:36
char a[]占用了6个字节空间,如果是局部变量,则分配在栈里面,"hello"占用6个字节,藏在代码里面,在程序运行的时候,有个初始化动作,会"hello"这个位置的内容,拷到char a[]这个位置去
会占用两份空间,一份是占用程序空间,一份是占用数据空间,只是编译器自动加了一个拷贝动作进去
char a[]占用了6个字节空间,如果是局部变量,则分配在栈里面,"hello"占用6个字节,藏在代码里面,在程序运行的时候,有个初始化动作,会"hello"这个位置的内容,拷到char a[]这个位置去
会占用两份空间,一份是占用程序空间,一份是占用数据空间,只是编译器自动加了一个拷贝动作进去
老丁-厦门(43515273) 10:44:14
堆栈,老和单片机的区分不开,单片机的堆栈就是这里的栈,惯性思维
堆栈,老和单片机的区分不开,单片机的堆栈就是这里的栈,惯性思维
厦门英智-黄双全(962017) 10:44:23
char a[10]占用了10字节的数据空间,"hello"占用了6个字节的代码空间
char a[10]占用了10字节的数据空间,"hello"占用了6个字节的代码空间
郭志顺(513367429) 10:45:49
那是不是还有拷贝行为
那是不是还有拷贝行为
厦门英智-黄双全(962017) 10:47:23
数据空间的占用,根据你定义方式的不同,而不同,可能会存储在“全局变量(全局空间,程序编译完后,大小是固定的),局变量(栈)”两种情况,如果需要存堆中,则需要调用malloc手动分配内存,再对它进行赋值
是的,是还有拷贝行为
所有对变量的初始化,都有一个拷贝行为
数据空间的占用,根据你定义方式的不同,而不同,可能会存储在“全局变量(全局空间,程序编译完后,大小是固定的),局变量(栈)”两种情况,如果需要存堆中,则需要调用malloc手动分配内存,再对它进行赋值
是的,是还有拷贝行为
所有对变量的初始化,都有一个拷贝行为
厦门英智-黄双全(962017) 10:48:33
变量定义,在程序运行过程中,分定义和赋值过程,初始化,就是把定义和赋值写在一行代码中而己
变量定义,在程序运行过程中,分定义和赋值过程,初始化,就是把定义和赋值写在一行代码中而己
郭志顺(513367429) 10:49:00
嗯,明白了,非常的透彻
这些知识是属于编译原理里面的吗?
嗯,明白了,非常的透彻
这些知识是属于编译原理里面的吗?
厦门英智-黄双全(962017) 10:52:10
有部份编译原理的知识,也有系统及硬件体系结构相关的知识
有部份编译原理的知识,也有系统及硬件体系结构相关的知识