C语言的存储单元问题
问题一:怎样让,定义的全局变量的地址连续?能够举个例吗?问题二:能够这样定义吗?unsignedchara,b,c,d,e;unsignedcharTab[]={a,b,...
问题一:怎样让,定义的全局变量的地址连续?能够举个例吗?
问题二:能够这样定义吗?
unsigned char a,b,c,d,e;
unsigned char Tab[]={a,b,c,d,e} 展开
问题二:能够这样定义吗?
unsigned char a,b,c,d,e;
unsigned char Tab[]={a,b,c,d,e} 展开
展开全部
让全局变量拥有连续的地址有两种方法:
1. 定义数组,比如 unsigned char a[100];
这样就定义了一个长度为100的类型为unsigned char的数组,相当于100个unsigned char 类型的全局变量,他们的地址是连续的:第一个地址为a,第二个为a+1,……
2. 全局作用域中定义一个指针,然后在主函数main中为其动态分配内存,比如全局作用域中定义unsigned char *p,主函数中动态分配内存语句如下:
p=(unsigned char*)malloc( 100 * sizeof(unsigned char));
意义就是分配100个unsigned char 类型变量所占据的连续内存,使p指针指向该段内存的首地址。
我们并没有办法让不同类型的变量具有连续的地址,除非定义结构体,然后使用结构体类型定义全局变量。结构体定义如下:
struct S_Type{
int a;
double c;
};
struct S_Type s_var;
这时候s_var结构中有两个Field(其实也可以称为变量),其地址是连续的。
不过,该地址连续仅仅是指应用程序层次的地址连续。操作系统不一定会把该段地址空间映射到连续的物理内存地址上。然而,应用程序并不用关心物理内存地址。
还有一点,全局变量要么不初始化,要么必须用常量或者常量表达式初始化。
int a=100;
int b=a;
这么定义全局变量并初始化是不对的。尽管编译器可以知道a的值是100,但是它并不会去推断。
1. 定义数组,比如 unsigned char a[100];
这样就定义了一个长度为100的类型为unsigned char的数组,相当于100个unsigned char 类型的全局变量,他们的地址是连续的:第一个地址为a,第二个为a+1,……
2. 全局作用域中定义一个指针,然后在主函数main中为其动态分配内存,比如全局作用域中定义unsigned char *p,主函数中动态分配内存语句如下:
p=(unsigned char*)malloc( 100 * sizeof(unsigned char));
意义就是分配100个unsigned char 类型变量所占据的连续内存,使p指针指向该段内存的首地址。
我们并没有办法让不同类型的变量具有连续的地址,除非定义结构体,然后使用结构体类型定义全局变量。结构体定义如下:
struct S_Type{
int a;
double c;
};
struct S_Type s_var;
这时候s_var结构中有两个Field(其实也可以称为变量),其地址是连续的。
不过,该地址连续仅仅是指应用程序层次的地址连续。操作系统不一定会把该段地址空间映射到连续的物理内存地址上。然而,应用程序并不用关心物理内存地址。
还有一点,全局变量要么不初始化,要么必须用常量或者常量表达式初始化。
int a=100;
int b=a;
这么定义全局变量并初始化是不对的。尽管编译器可以知道a的值是100,但是它并不会去推断。
展开全部
1. 有什么意义呢?如果执意追求这一点,可以将需要连续分配的全局变量组合起来声明为一个结构体。
2. 不可以。
2. 不可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用数组表示就可以了,或者动态分配 type *p = (type *)malloc(sizeof(type)); p[i]就可以引用。至于不同类型我就不知道了,因为不清楚标准里结构体是否为连续存储,不过一般的实现都是连续存储结构的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询