博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]char *p="1234567890"以及C/C++的内存
阅读量:5809 次
发布时间:2019-06-18

本文共 1202 字,大约阅读时间需要 4 分钟。

348人阅读
(1)

 这个"1234567890"字符串不再堆上也不在栈上!而是在文字常量区,而指针p在栈上。

文字常量区:常量字符串就是放在这里的.程序结束后由系统释放。

比如:
int a = 0; 全局初始化区 
char *p1; 全局未初始化区 
main() 
int b; 栈 
char s[] = "abc"; 栈 
char *p2; 栈 
char *p3 = "123456"; 123456/0在常量区,p3在栈上。 
static int c =0; 全局(静态)初始化区 
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); 
分配得来得10和20字节的区域就在堆区。 
strcpy(p1, "123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 
}
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
char *p="1234567890";
这个语句是有问题的,解释如下:
"1234567890"是一个字符串常量,C和C++的标准都规定:任何试图改变字符串常量的行为其结果是“未定义的”。但是上述语句的指针定义却不能阻止通过指针 p 来改变字符串常量"1234567890"的这种行为,比如:*p = 'a';,编译器发现不了这个错误。
正确的定义方式应该是:const char *p="1234567890";
那么指针可以这样初始化吗?
回答又是可以的。由于历史的原因,标准在这一点上作了一些“妥协”:既允许字符常量指针自动转换为非常量指针。但是使用者应该知道这样做存在着上述问题。因为这个原因,C++标准把这种转换标记为“Deprecated”,应该避免使用。

 

而与此不同的是这种声明方法:

char *p = (char *)10

这将使p指向地址0x0000000a,会个系统造成相当的破坏

转载于:https://www.cnblogs.com/KingOfFreedom/archive/2012/12/08/2809218.html

你可能感兴趣的文章
Ext gridPanel 单元格数据的渲染
查看>>
Android SDK 的下载代理
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
LNMP一键安装
查看>>
SQL Server数据库概述
查看>>
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>
华为3026c交换机配置tftp备份命令
查看>>
Oracle命令导入dmp文件
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
Http、TCP/IP协议与Socket之间的区别(转载)
查看>>
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
查看>>
.net excel利用NPOI导入oracle
查看>>
vrpie在Visio Studio 中无法调试的问题
查看>>
第六课:数据库的基本工具
查看>>
关于二叉树重构的思索
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
skynet实践(8)-接入websocket
查看>>