1
89
将具有相同内容的两个不同字符串文字放在同一内存位置还是不同内存位置取决于实现。
你应该经常治疗
C11标准,6.4.5,字符串文字,语义
打印格式必须为
看见 this answer 原因。 |
2
28
您的编译器似乎很聪明,可以检测到两个文本是相同的。由于文字是常量,编译器决定不存储两次。 值得一提的是,情况并非一定如此。请参阅 Blue Moon 的 answer on this .
顺便说一句:
像
此外,我想说代码错过了
*1:铸造到
|
3
18
您的编译器已经完成了一项名为“字符串池”的操作。您指定需要两个指针,两个指针都指向同一个字符串文字,所以它只复制了文字的一个副本。 从技术上讲:它应该抱怨你没有把指针变成“const”
这可能是因为您使用的是Visual Studio,或者使用的是不带-Wall的GCC。 如果您明确希望它们在内存中存储两次,请尝试:
在这里,您明确表示需要两个c字符串字符数组,而不是两个指向字符的指针。 注意:字符串池是编译器/优化器的一个特性,而不是语言的一个方面。因此,不同环境下的不同编译器将产生不同的行为,这取决于优化级别、编译器标志以及字符串是否位于不同的编译单元中。 |
4
15
正如其他人所说,编译器注意到它们具有相同的值,因此决定让它们在最终可执行文件中共享数据。但它变得更花哨了:当我用
它打印
(这是一个答案,因为太长了,无法发表评论。) |
5
3
代码中的字符串文字存储在代码的只读数据段中。当你写下像“abc”这样的字符串文字时,它实际上会返回一个“const char*”,如果你有所有的编译器警告,它会告诉你此时正在进行强制转换。你不能因为你在这个问题中指出的原因而更改这些字符串。 |
6
2
当你创建一个字符串文字(“abc”)时,它会被保存到一个内存中,内存中包含字符串文字,然后如果你引用相同的字符串文字,它就会被重用,因此两个指针都指向存储“abc”字符串文字的同一位置。 我很早以前就知道了,所以我可能没有解释清楚,对不起。 |
7
2
事实上 取决于您使用的编译器 . 在我的系统中 总胆固醇++3.5 它打印 两个指针的两个不同值,即两个不同的地址 . 你的编译器是经过设计的。它会 检查内存中是否存在任何值 并且取决于它的存在 它将重新分配 或 使用相同的引用 如果引用了相同的值,则为先前存储的值的值。 所以不要想太多 取决于编译器解析的方式 代码。 这就是全部。。。 |
8
1
因为字符串“abc”本身就是内存中的一个地址。当你再次写“abc”时,它会存储相同的地址 |
9
1
这是编译器优化,但忽略了可移植性的优化。有时编译后的代码比实际代码更具可读性。 |
10
0
您使用的是字符串文字, 当编译器捕获两个相同的字符串文字时, 它给出相同的存储器位置, 因此它显示相同的指针位置/ |
Adeline · Swift日期文字/从字符串初始化日期 7 年前 |
cmeeren · 为什么不能在F#中添加int和float文字? 7 年前 |
Soldalma · 我可以创建条件文字吗? 7 年前 |
Nathan · 在Fixnum的实例上定义方法 7 年前 |
rocking · 比较两个字符串文字[重复] 10 年前 |