char*str="hello";
在这种情况下,字符串文本存储在只读存储器中。
char str[10]="name";
在这种情况下,字符串文本存储在可写内存中。
为什么分配的内存与两个字符串文字有差异?
编译可执行文件时,字符串文本必须来自程序中的某个地方。因此,它们与文本一起存储在一个特殊的数据段中。由于您不希望每次执行时都修改程序文本,因此该段将以只读方式映射到进程VM中。
如果只需要读取常量文字,那么指针引用就足够了。
但是,一旦需要对其进行修改,就需要像在第二个声明中那样进行复制,这将在范围启动时将字符串文本复制到堆栈中。
文字本身没有区别。区别在于你告诉编译器你想要的实际变量,str
。该变量有不同的类型,因此不同的类型有不同的表示形式。
在第一种情况下,你说“我希望str
是一个字符指针,初始化到字符串“hello”
将被找到的某个地方(我不在乎在哪里)。
在第二种情况下,您说"我希望str
是一个10个字符的数组,其中五个第一个用字符串"name"
初始化。
这些显然是完全不同的事情。对于第二种情况,在程序中,字符串literal“name”
很可能仍然存在于某个只读位置,但在程序启动时被复制到str
。
在char*str=“hello”的情况下
(实际上应该是通过const char*str=“hello”
)实际的字符串文本以数组的形式存储在只读内存中,而str
只指向该数组。在第二个示例中,数组存储在全局数据段(对于全局变量)或堆栈(对于本地数据)中,没有指针。
这样想一下:
对于
const char *str = "hello";
你有
+-----+ +-----------+ | str | ---> | "hello\0" | +-----+ +-----------+
而
char str[] = "hello";
你有
+-----------+ | "hello\0" | +-----------+
我有示例字符串,例如: 数据Management_Commercial信息管理系统 数据管理_非结构化数据管理(文本文档、纸质表格等。) 我通过< code>input-move-boxes从jsp页面传递字符串。所以在jsp页面中我有: 这种情况下的< code >输入移动框是 在java类中,这些在< code>String[] selecteddm变量中检索。 但我一次传一根绳子。因此,当我
在我的班级中,我有一个属性: 并希望将其设置为: 设置此设置时,我会得到错误
我使用空手道框架V0.7.0来执行一些自动API测试。 我有一个测试在以下场景中返回异常com.intuit.karate.exception.KarateExcture:原因:不是一个子字符串 下面是以下场景: 情况1和2正确通过。 案例3返回以下内容: 我手动检查过,这是案例3的JSON答案: 我不明白为什么只有案例3失败了。 有什么想法吗? 谢谢! 编辑1:“引用”是错误的复制粘贴。对此表示
问题内容: 我有以下代码,我想为浮点数指定一个十进制值而又不损失精度。 输出: 5.88 预期输出: 525.880005 问题答案: 仅具有7-8位有效数字。您的示例中的“ 5”是第9位数字。 即使它具有足够的精度,我也不知道525.880005是否可以精确表示为二进制浮点数。大多数十进制值不是:) 如果确切的十进制表示形式对您很重要,则应使用。
问题内容: 拥有Java代码 该字符串将分配在相同的内存位置(或多倍): 是否多次启动同一程序(并行)执行? 可能的答案: 我目前是C#开发人员(尽管在上个千年中使用Java编程)。 我之所以问这个问题,是因为我相信.NET CLR和Java(JVM)之间是相同的,我希望得到.NET应用程序的答案(但由于经常遇到的“应用程序”池术语而引起疑问)。 答案是 字符串 实习生池由同一JVM或.NET C
当我将接口的任何属性设置为可选时,我会在将其成员分配给其他变量时遇到如下错误: 我如何绕过这个错误?