我在学习Python之前就开始使用C,而且我对某些概念有些怀疑。
我在64位计算机上运行此示例。
/* I understand that "vid" is only a char like any other else not a array of char
and its sizeof is 1 byte. The decimal int is 100 and the char is 'D'.
Why? 'vid' does not exist in ASCII table. How does the compiler leads with that */
char name = "vid";
/* sizeof is 8 bytes. I am not sure because if char is int therefore an array
of char would
be an array of int and if so int takes 2 or 4 bytes storage size so we reach that is
3 char long plus the NULL byte ('\0') we get 3 * 2 bytes + 1 * 2 bytes = 8 bytes .
Am i correct? And why we need to use * to declare it? Does * is not for pointers?
How does this syntax works? */
char *name_ = "vid";
答案 0 :(得分:2)
像"vid"
这样的字符串常量衰减成指向其第一个字节的指针,当您将指针转换为char
时,程序将截断指针的值以使其适合。显然,这会在您的计算机上产生一个ASCII值为D
的数字。如果您使用GCC进行编译,则会收到initialization makes integer from pointer without a cast
警告。
sizeof(name_) == sizeof(char*)
,在具有64位指针的计算机上为8。 sizeof("vid") == 4
,根据定义:sizeof
以char
为单位衡量大小。
答案 1 :(得分:1)
在第一个例子name = "vid"
中,你没有将字符串"vid"
分配给name,通过对称,字符串常量是指向它的第一个元素的指针,因此在第一个语句中你指定了地址"vid"
。像其他人偶然所说的那样,在name
之后,地址变为1个字节后存储的数字是'D'
的ascii代码。但是,如果你打开警告,你会收到一条错误消息,告诉你,你的责任使char
char *
与char
不兼容char *name_ = "vid"
只能保留1个字节。
第二个示例"vid"
您将name_
的地址指定给char
,因为它是指向"vid"
的指针。
请注意,您没有在name_
中存储字符串"vid"
。字符串常量name_
存储在只读存储器中的某个位置,该字符串常量的第一个元素的地址被分配给{{1}}。
答案 2 :(得分:0)
对于你的第一个例子,我不确定如何编译。您正在尝试将字符数组分配给单个字符。如果没有某种警告,就不应该这样做。
对于第二个,你正在sizeof
一个char*
,这是一个指针。无论何时将*
添加到类型中,都可以将其作为指针。在您的情况下,这是8个字节,无论它指向多少数据。如果您想知道数据的大小而不是指针的大小,那么您需要执行以下操作;
sizeof(name_[0]) * 4
或
sizeof(char) * 4
由于您的数组是3个字符,因此空字符为+1,使其长4个字符。这将获取第一个元素的大小(单个字符,1个字节),并将其乘以字符串的长度。因此,您的数据大小应为4个字节。
答案 3 :(得分:0)
您的第一个代码字符串将name
声明为指向静态数据段中放置的四个字符数组的指针。因此,当您将名称视为字符时,您将获得指针的最后一个字节:0x ?????????????? 64其中'??'是未知的字节。
关于第二个字符串,您将获得指针的sizeof。在64位系统中,指针是64位或8字节。这就是你得到的。