2012-11-22 84 views
7

当我使用MinGW的,即时得到输出运行这个程序“=”两个字符串文字具有相同的指针值?

#include<iostream> 

using namespace std; 

int main() 
{ 
char *str1 = "Hello"; 
char *str2 = "Hello"; 

if(str1==str2) 
cout<<"="; 
else 
cout<<"!="; 


return 0; 
} 

然而,从逻辑上讲,它应该是!=,怎么把这些都是指针和他们指向不同的内存位置。当我在Turbo C++中运行这段代码时,我得到了!=

+2

您是否关闭优化? –

+9

“,他们指向不同的记忆位置”......好,事实证明,他们实际上指向相同的位置。这是允许的。 –

+3

源代码中的两个反引号应该防止它编译(并且符合C++ 11编译器缺乏'const'应该防止它编译)。 –

回答

13

你是对的,它们是指针。但是,它们是否指向不同的位置取决于实施。对于编译器来说,仅仅存储一次字符串文本并在代码中使用它的地址是完全有效的。

8

无法保证两个指针指向不同的内存位置。也许是因为优化,或者编译器使用自己的规则......行为是“实现定义”。

根据标准(C++ 11个§2.14.5字符串文字):

是否所有字符串文字是不同的(即,被存储在 非重叠对象)的定义执行去连接。

0

char *str1 = "Hello"; - 这条线,而允许的(许多编译器),是一个坏主意,怎么做。基本上只允许向后兼容C,并且实际写入* str1会导致未定义的行为。我会建议找到编译器设置,当你这样做的时候给你警告,如果你的编译器没有这样的警告找到一个新的编译器。

C++标准为编译器和执行环境提供了有关"String literals"存储位置的大量自由度。他们可以直接使用指向"String literals""literal"部分的指针作为"literal"的指针值,并将它们存储在您尝试编辑它们时发生段错误的内存中并非意外。

请注意,char buf1[] = "Hello";做了与char* str1 = "Hello";根本不同的东西:它实际上初始化缓冲区buf1与字符{'H','e','l','l','o','\0'}

+0

该标准定义了'char * str =“Hello”;'为无效。当编译器仍然支持它时,这是为了客户服务,而不是标准。 –

2

这是预期的结果。您可以通过查看底层程序集来验证这一点。例如,如果我建立与:

g++ -S ptr.c 

,那么你可以看到在文件输出以下(ptr.s):

 .file "ptr.c" 
     .def ___main;  .scl 2;  .type 32;  .endef 
     .section .rdata,"dr" 
LC0: 
     .ascii "Hello\0"    ; Note - "Hello" only appears once in 
             ; this data section! 
LC1: 
     .ascii "=\0" 
LC2: 
     .ascii "!=\0" 
     .text 
.globl _main 
     .def _main; .scl 2;  .type 32;  .endef 
_main: 
     [... some stuff deleted for brevity ...] 
LCFI5: 
     call ___main 
     movl $LC0, -12(%ebp)  ; This sets str1 
     movl $LC0, -8(%ebp)   ; This sets str2 
     movl -12(%ebp), %eax 

我评论的两个关键位 - 仅一个'Hello'的外观出现在底层代码的rdata部分,您可以看到str1和str2设置在最后,都指向相同的标签:LC0。这很重要'你好'是一个字符串文字,重要的是常量

正如其他人所指出的 - 在标准下这是完全合法的。

2

类型的字符串字面像"Hello"的是阵列常量字符的,因此,您所导向两个指针的东西,不允许更改过。

C++标准为编译器提供了将相同常量值合并在一起的自由(请注意,编译器不需要要求这样做)。

相关:该声明是因此是无效的,必须修改为:

const char *str1 = "Hello"; 
const char *str2 = "Hello"; 

,或者如果你想

char const *str1 = "Hello"; 
char const *str2 = "Hello"; 

读书时读很好地从右至左:

str1 is a pointer to const char 

相关问题