【问题标题】:size difference in various string initializations in C [duplicate]C中各种字符串初始化的大小差异[重复]
【发布时间】:2016-04-02 23:44:28
【问题描述】:

我开始学习 C 并遇到了一个我找不到答案的问题。

当我用

初始化一个随机字符串时
char *str1 = "Big";
printf("size of str1: %ld\n", sizeof(str1));

当我执行sizeof(str1) 时,它给了我 8(字节)的大小,这对我来说没有意义。

当我用

初始化一个随机字符串时
char str2[] = "Big";
printf("size of str2: %ld\n", sizeof(str2));

当我执行 sizeof(str2) 时,它给了我 4(字节)的大小,这对我来说很有意义,因为三个字符 'B''i''g''\0'

为什么第一个给我 8 码?

【问题讨论】:

  • J - 虽然我没有投反对票,但我可以推测原因是因为这是一个相当基本的问题,无论搜索 S.O.或一般的网络。别担心,这不是世界末日。但是,展望未来,如果您想避免进一步的反对票,请确保在提问之前做出合理的努力。所以。在这里可以提供帮助,但不应使用它来避免基本的阅读或学习。祝你好运,欢迎来到 S.O.
  • David - 谢谢,下次我会更加努力地自己找东西。我对这里很陌生,我什至不知道我被否决了……哈哈。对不起大家。
  • 别担心被否决,我们都有自己的份额。这是一个很棒的网站,我们都尽自己的一份力量使其尽可能有用。投票/声誉系统只是为网站增加了一点……完整性。再次欢迎您加入。
  • 谢谢先生!这真的是一个很棒的网站!在这里可以学到很多东西。
  • 数组和指针是不同的类型!

标签: c arrays string pointers sizeof


【解决方案1】:

首先,当在指针上使用sizeof 时,它会给出数据类型的大小,即指针本身,而不是分配或指向的大小 内存位置。

所以,如果

char *str1 = "Big";

sizeof(str1) 会给你str1 本身的大小,即char * 的大小。这将根据您使用的平台和编译器而有所不同,例如对于 32 位,它将是 4,对于 64 位,它将是 8,通常

那么,

 char str2 = "Big";

无效。如果你的意思是

 char str2[] = "Big";

在这种情况下,str2 是一个 数组,由提供的字符串和空终止符初始化。因此,总大小将是4 * sizeof(char),即 4。

【讨论】:

  • 哦,是的,我的意思是 str2[]。我懂了!那么指针的大小是8个字节?谢谢!
  • 但请注意,sizeof (a pointer) 并不总是8。例如在x86 上,大小为4。所以它依赖于架构。
  • 好的,非常感谢!
【解决方案2】:

str1 是一个指针,任何指针(int,char,float)的大小必须是 4 byte8 byte 取决于机器.

sizeof() 用于获取任何类型数据的实际大小(以字节为单位)。

此外,sizeof() 是一个编译时表达式,可为您提供类型或变量类型的大小。它不关心变量的值。

此外,sizeof() 将针对不同的声明给出不同的结果。

第二个str2,数组声明,将返回包含终止空字符的数组长度。

【讨论】:

  • 指针可以是任意大小,最好不要做任何假设
【解决方案3】:
char *str1 = "Big";

str1 是一个字符指针。通常sizeof( pointer ) 是固定大小的,并且取决于机器。所以sizeof( char* ) = sizeof( int* ) = sizeof( any pointer ) 通常是 4 Bytes(32 位机器)或 8 Bytes(64 位机器)。不过可能有一些exceptions

char str2[] = "Big";  

str2 一个以'\0'结尾的字符数组,即sizeof( str2 ) = 4

【讨论】:

  • 谢谢你的回答,是不是因为我的系统是64位的,给了我8个字节?凉爽的!我的意思是 str2[],对不起!
  • 指针可以是任意大小(指向不同类型的指针在同一台机器上可能有不同的大小),最好不要做任何假设
  • 我明白了,我将停止对此做出任何假设。谢谢!
  • @M.M - 感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多