20130324 LBP CSLBP 全局存储区 局部存储区 char c[]=”hello world”和char *str=”hello world”的区别

1、LBP and CSLBP

2、再论char c[]=”hello world”和char *str=”hello world”的区别

/**************代码1*********************/
char *strA()   
{
    char str[]="hello world";
    return str;
}
/****************代码2****************/
const char *strA()
{
    char *str="hello world";
    return str;
}
/***************代码3***************/
const char *strA() 
{
    static str[]="hello world";
    return str;
}

上述代码1:由于定义的str[]是一个char数组变量,在编译期间,很明显知道了str[]是在栈上分配内存地址,所以编译器就把字符串“hello world”认为是该内存地址的内容,但是这里的str是局部变量,虽然通过返回值可以找到这个地址,但是由于跳出函数之后被释放了(表示该内存空间可用,意味着可以修改这个值),其他程序的其他部分有可能会修改这个值,可能造成程序崩溃。可以如下修改,但不提倡,会出现警告!!!

image

上述代码2:这是对代码1的修改。由于str是char型指针变量,需要将它指向一个内存地址,编译期间,由于“hello world”是一个字符串常量,需要在存放在只读区(用于存放常量和程序)。所以str指针就指向只读区,而只读取的内容是无法更改的(所以加了const),所以str在strA函数结束之后不会释放。

                    如果有以下语句 char *str="hello world";*str=b;讲出现以下错误:

                   image

上述代码3:是代码1的改进。这里static变量保证了函数退出后,变量的内存不被释放。

posted @ 2014-03-24 17:02  yexuannan  阅读(1386)  评论(0)    收藏  举报