Difference in size of a pointer to a string, and sizeof a a string
Possible Duplicate:
Question about pointers and strings in C
1 2 3 4 5 6 7 8 9 10
| #include<stdio.h>
int main()
{
char *str1="abcd";
char str2[]="abcd";
printf("%d %d %d
",sizeof(str1),sizeof(str2),sizeof("abcd"));
return 0;
} |
为什么这个代码对sizeof(str2)和sizeof("abcd")给出相同的答案,即使str2在理想情况下就像一个指向字符串的指针,str1也是如此,所以答案应该是4 4 5
Ideone密码:http://ideone.com/za8av
答:4 5 5
- 抱歉,我的问题没有回答,为什么str2不应该和str1相同(在它的定义中是指向字符串的指针)
- 第一个是指针,第二个是数组。指针和数组。它们是两个完全不同的东西。这就是为什么它们"不应该是相同的"。为什么你期望两个完全不同的事物以同样的方式表现?你知道,很难回答这样的问题,当几乎不可能开始理解为什么你发现这种行为很奇怪的时候。你基本上是在问"为什么汽车不同于苹果"。如何回答这样一个问题?
- 隐马尔可夫模型。。明白了,str2[]相当于"abcd",它是一个字符数组,而str1是一个指针,那么你能不能澄清一下str2[]到底是什么,是指针还是字符串?
- str2是char [5]类型的对象(一个由5个char组成的数组)。在您的示例中,它正好存储字符串"abcd"。
字符数组不是char指针。虽然数组在传递给函数时会衰减到指针,但它们本质上是不同的(具体来说,编译器知道它们在编译时的确切长度)。对于四个字符的字符串,您看到5的原因是字符串文本为终止零多保留一个char。另一方面,4依赖于系统:在具有32位指针的系统上,您将看到4,而在具有64位指针的系统上,您将看到8。
- #包括stdio.h > < int main(){ char *判断str1 ="ABCD";char字符串str2 ="ABCD";printf("%c %c N * *判断str1,str2");printf("%d,%d",n"(sizeof判断str1,sizeof)(sizeof str2),("ABCD"));/azfcz返回0;} ideone.com我变一样,输出,判断str1和str2 for both * *
- about the size字节的附加在编译时已知的精确。这是解释the important for the推理行为,不只是handwave说"就是这样。"
- 谢谢@ WUG,我在the process of the more details答案编辑增加成- This is an important!
- 请把dasblinkenlight some please @黑莓光在线你是什么想说,根据我的判断str1和str2的解释都是分到character字符串(阵列),因此我们应该和我有一个4输出5。
- 解释:你@ D is incorrect DREF。str1is a的指针。str2is not a的指针。str2is an阵列。这是的there is to it.
- drefd that is incorrect",char str2[]is not a的指针,它是安安implicitly阵列与定义的大小。EN is the same as the char str2[5]-让你的编译器5滴茶,因为它可以数字出来from the same初始化,but that is the thing。在char str2[]becomes宣言,在宣言,它是只有当指针参数的函数:void foo(char str2[])。
- 谢谢你的时间和帮助……for the EEA混合两..thanks for我怀疑我@ dasblinkenlight结算
你从哪里知道str2是"理想的就像一个指向字符串的指针"?不是这样。str2是一个数组。当运算符sizeof应用于数组时,它返回数组对象的大小(以字节为单位)。
字符串文字也是一个数组,所以当sizeof应用于字符串文字时,它将以字节为单位返回该数组对象的大小。因此,期望sizeof("abcd")和sizeof(str2)产生相同的结果是很自然的。他们这样做了。
P.S.%d不是打印sizeof结果的适当格式说明符。%d需要int参数,而sizeof产生size_t值。使用%zu打印size_t类型的值。
- 使用std::ostream*不要担心,the actual类型。
- 詹姆斯:是真的"甘孜安问题的兴趣。does that它"知道"std::ostream担保size_t型输出values of how to?学院的课程,它在overloads for has <<建立在积分形式,but can be defined as a size_t执行非标准Unsigned积分型特异性。granted will probably make some转换,它适用于任何工作在家,但无论如何…
- 我不在这里有access to the C标准。POSIX标准……that the size_tnot be the page比空气日期2010年1月17 long兼容性的要求;在与C标准要求的方式,但我怀疑worded makes the is the language of the款;with this is that of the约束强于C的标准。for the休息:在实践size_twill be one of the types EN标准积分,but there is like does面貌安监督on the part of the C++标准委员会:嗯,我期望<<required for as阱扩展类型的积分。