c语言中存储总结:
1、局部变量存储在栈中;
2、全局变量和静态变量(包括全局和局部静态变量)存储在静态存储区;
3、使用new申请的内存是动态申请的,存在于堆中;
4、字符串常量也是存储在静态存储区
/**栈中的变量只作用与其定义的所在区间内,一旦改区间结束则变量所占的内存也是自动释放
* 分配在堆中的内存则需要使用free delete等释放
*/静态存储区的变量常量会一直存在直至程序结束
char* c ="luzixu" 其中"luzixu"为字符串常量,存在静态存储区,字符串常量放在静态内存区会提高效率,且不能修改;
看下面一段程序:
char* fun1() {
char* p = "luzixu";
return p;
}
int main() {
cout<<fun1()<<endl;
return 0;
}
这段程序没有错,函数返回的是静态字符串常量的首地址;但是用gcc会提示:警告: 不建议使用从字符串常量到‘char*’的转换
char* fun2() {
char p[]= "luzixu";
return p;
}
int main() {
return 0;
}
这段程序就会出错,因为数组p为局部变量,当退出函数是,变量p被清空;所以会出现乱码
解决办法:将变量p设为static的就好
char* fun2() {
static char p[]= "luzixu";
return p;
}
int main() {
cout<<fun2()<<endl;
return 0;
}
字符串常量只有一份copy,看下面一段程序char* fun2() {
char *str= "luzixu";
char *tt= "luzixu";
cout<<static_cast<const void*>(str)<<endl;
cout<<static_cast<const void*>(tt)<<endl;
return str;
}
int main() {
cout<<fun2()<<endl;
return 0;
}
str和tt所指向的字符串的首地址相等