为什么我在这个char中得到这个十进制int?

时间:2014-01-21 13:47:11

标签: c byte

我在学习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";

4 个答案:

答案 0 :(得分:2)

  1. "vid"这样的字符串常量衰减成指向其第一个字节的指针,当您将指针转换为char时,程序将截断指针的值以使其适合。显然,这会在您的计算机上产生一个ASCII值为D的数字。如果您使用GCC进行编译,则会收到initialization makes integer from pointer without a cast警告。

  2. sizeof(name_) == sizeof(char*),在具有64位指针的计算机上为8。 sizeof("vid") == 4,根据定义:sizeofchar为单位衡量大小。

答案 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字节。这就是你得到的。