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是局部变量,虽然通过返回值可以找到这个地址,但是由于跳出函数之后被释放了(表示该内存空间可用,意味着可以修改这个值),其他程序的其他部分有可能会修改这个值,可能造成程序崩溃。可以如下修改,但不提倡,会出现警告!!!
上述代码2:这是对代码1的修改。由于str是char型指针变量,需要将它指向一个内存地址,编译期间,由于“hello world”是一个字符串常量,需要在存放在只读区(用于存放常量和程序)。所以str指针就指向只读区,而只读取的内容是无法更改的(所以加了const),所以str在strA函数结束之后不会释放。
如果有以下语句 char *str="hello world";*str=b;讲出现以下错误:
上述代码3:是代码1的改进。这里static变量保证了函数退出后,变量的内存不被释放。



浙公网安备 33010602011771号