首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问,局部常量空间的释放

2012-04-08 
请教,局部常量空间的释放看到了一下一段代码:C/C++ codeint a 0 //全局初始化区 char *p1 //全局未初

请教,局部常量空间的释放
看到了一下一段代码:

C/C++ code
int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "123456"; //123456在常量区,p3在栈上。 static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); //123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 } 


据说:  
全局变量、全局静态变量、局部静态变量放在全局(静态)数据区;  
全局常量放在常量数据区。

我的疑问是:
(1) 数组s保存在栈区,那么"abc"保存在哪里?
(2) 局部常量都放在常量数据区吗?比如上面的char s[] = "abc";和char *p3 = "123456";
(3) 我在PDA上有个嵌入式的程序需要处理大量的局部常数,每次执行都会耗用大量的资源,程序变得很慢,怎么释放已占用的局部常量数据区?

[解决办法]
(1) 数组s保存在栈区,那么"abc"保存在哪里? 
(2) 局部常量都放在常量数据区吗?比如上面的char s[] = "abc";和char *p3 = "123456";
这两个问题属于同一个概念:数组s在栈内,"abc"在静态存储区,栈内数组s用静态区字符串"abc"的内容来初始化!指针变量p3本身在栈内,但它指向了静态数据区字符串"123456"的首地址。
对于指针p3的问题搂住可以自己写个程序验证一下,对于char s[]="abc"的情况,我写了一段代码来,搂住可以验证以下。
C/C++ code

#include<stdio.h>
int main() //vc6.0编译通过!
{
char begin='z';
char i=0;
char p[]="abcdefg";
char *temp;
char end='x';
temp=&("abcdefg");
printf("begin's address is: %#x\n",&begin); //栈的起始地址,忽略编译器占用的空间
printf("end's address is: %#x\n",&end); //栈的终止地址,同上
printf("p[0]'s address is: %#x\n",p); //数组的起始地址
printf("string's address is: %#x\n",&("abcdefg")); //静态区字符串的地址
while(*(temp+i))
{
printf("p[%d]=%c ; *(temp+%d)=%c\n",i,p[i],i,*(temp+i));
//逐字符对比显示栈内数组和静态字符串的内容
i++;
}

}


[解决办法]
引用楼主 dghh159 的帖子:
(1) 数组s保存在栈区,那么"abc"保存在哪里?
(2) 局部常量都放在常量数据区吗?比如上面的char s[] = "abc";和char *p3 = "123456";
(3) 我在PDA上有个嵌入式的程序需要处理大量的局部常数,每次执行都会耗用大量的资源,程序变得很慢,怎么释放已占用的局部常量数据区?

[解决办法]
我的疑问是: 
(1) 数组s保存在栈区,那么"abc"保存在哪里? 
char s[] = "abc";
abc就是数组s保存的值啊! 保存在栈区,

(2) 局部常量都放在常量数据区吗?比如上面的char s[] = "abc";和char *p3 = "123456"; 
前面一种不是常量,相当于char s[4] = {'a','b','c','\0'};
后面的是,相当于const char* p3 = "123456";

(3) 我在PDA上有个嵌入式的程序需要处理大量的局部常数,每次执行都会耗用大量的资源,程序变得很慢,怎么释放已占用的局部常量数据区?
你是不是弄错概念了,
[解决办法]
(1) 数组s保存在栈区,那么"abc"保存在哪里?--------->因为是数组形式,所以"abc"在栈中,跟踪栈空间查看即可 
(2) 局部常量都放在常量数据区吗?比如上面的char s[] = "abc";和char *p3 = "123456"; --->后者是指针形式,只有p3在栈上,"123456"在常量数据区
(3) 我在PDA上有个嵌入式的程序需要处理大量的局部常数,每次执行都会耗用大量的资源,程序变得很慢,怎么释放已占用的局部常量数据区?----->用局部变量吧,如char s[] = "abc";局部常量数据区是无法释放的,只有到程序结束

热点排行
Bad Request.