Dra*_*lex 19 c memory string pointers
我知道为了比较C中的两个字符串,您需要使用该strcmp()函数.但我试图将两个字符串与==运算符进行比较,并且它有效.我不知道如何,因为它只是比较两个字符串的地址.如果字符串不同,它应该不起作用.但后来我打印了字符串的地址:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* str1 = "First";
char* str2 = "Second";
char* str3 = "First";
printf("%p %p %p", str1, str2, str3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
00403024 0040302A 00403024
Process returned 0 (0x0) execution time : 0.109 s
Press any key to continue.
Run Code Online (Sandbox Code Playgroud)
怎么可能str1和str3具有相同的地址?它们可能包含相同的字符串,但它们不是同一个变量.
use*_*738 22
无法保证它永远都是这样的.通常,实现者维护一个文字池,只保留每个字符串文字一次,然后对于字符串文字的多个用法,使用相同的地址.但是人们可能会以不同的方式实现它 - 标准并没有对此构成约束.
现在你的问题是:你正在查看指向同一个字符串文字的两个指针的内容.相同的字符串文字产生相同的值(它们衰变为指向第一个元素的指针).但是由于第一段中陈述的原因,该地址是相同的.
另外,我要强调使用强制转换提供%p格式说明符的参数(void*).
Ser*_*sta 14
这里有一个有趣的观点.你实际上只有3个指针指向const litteral字符串.所以编译器就可以创建一个单一的字符串"First",并同时拥有str1和str3有道理.
这将是一个完全不同的情况:
char str1[] = "First";
char str2[] = "Second";
char str3[] = "First";
Run Code Online (Sandbox Code Playgroud)
我已经宣布从litteral字符串初始化 3个不同的char数组.测试它,您将看到编译器为3个不同的字符串分配了不同的地址.
你应该记住的是:指针和数组是不同的动物,即使数组可以衰减到指针(在这篇文章中更多关于它的C FAQ)
当特定字符串文字在源文件中多次出现时,编译器可以选择将该文字的所有实例指向同一位置.
C标准的 6.4.5节描述了字符串文字,其中说明如下:
7如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.
其中"未指明的行为"在第3.4.4节中定义为:
使用未指明的值,或本国际标准提供两种或更多种可能性的其他行为,并且在任何情况下都不会对其进行任何进一步的要求
在您的情况下,字符串文字"First"在源中出现两次.因此编译器对两者使用相同的文字实例,从而导致str1并str3指向同一实例.
如上所述,无法保证此行为.这两个实例"First"可能彼此不同,导致str1并str3指向不同的地方.字符串文字的两个相同实例是否位于同一位置是未指定的.
| 归档时间: |
|
| 查看次数: |
2981 次 |
| 最近记录: |