一个非常基本的C问题。为什么以下两个命令会导致创建具有不同大小的字符串?
如下所示,方法1创建一个大小为8字节的字符串,方法2创建一个大小为5字节的字符串。
我很困惑为什么方法1创建一个大小为8字节的字符串......
(我已经看过这些帖子:Difference of sizeof between char* x and char x[]和What is the difference between char s[] and char *s?。除非我有阅读理解 - 失败,否则它并没有真正解决为什么方法1创建一个大小为8字节的字符串的原因...根据响应,似乎方法1应该创建一个大小为4字节的指针。)
方法1:
char *string = "ABCD";
方法2:
char string2[5] = "ABCD";
例如,当我运行以下程序时,我得到如下所示的输出。
#include <stdio.h>
int main(int argc, char *argv[])
{
char *string = "ABCD";
printf("Based on \"char *string = \"ABCD\":\n");
printf("Size of string: %ld\n",sizeof(string));
printf("Size of each element of string: %ld\n",sizeof(string[0]));
printf("String: %s\n\n", string);
char string2[5] = "ABCD\0";
printf("Based on \"char string2[5] = \"ABCD\":\n");
printf("Size of string: %ld\n",sizeof(string2));
printf("Size of each element of string: %ld\n",sizeof(string2[0]));
printf("String: %s\n\n", string2);
return 0;
}
上述计划的输出:
答案 0 :(得分:1)
那是因为在这一行char *string = "ABCD";
中你声明了一个指向char的指针,这个指针大小为8字节,在这行char string2[5] = "ABCD";
中你声明一个由5个字符组成的数组char
长度为1个字节,1 * 5 == 5 bytes
则string2
的大小为5个字节
答案 1 :(得分:0)
char只需要保存一个ASCII值,这是一个非常小的数字范围,因此它们每个只占用1个字节。
char *是指向内存中地址的指针,这是一个更大的数字范围,因此需要更多的字节来存储它。 32位系统上的指针占用4个字节,而在64位系统上占用8个字节。
我认为你是在64位系统上运行的吗?我认为这就是8字节的原因。
答案 2 :(得分:0)
在第一个示例中,您声明一个变量,该变量是指向char
的指针。因此,当您使用sizeof
获取其大小时,您将获得指针的大小(而不是它指向的大小),这是64位平台上的8个字节。
在第二个示例中,您声明一个char
数组的变量。在C中,sizeof
数组按预期方式执行 - 它以字节为单位返回数组的大小,在本例中为5 * sizeof(char)
(因为您声明了一个5个字符的数组),这是5 (自sizeof(char) = 1
)。
在任何一种情况下,使用sizeof
通常不是衡量字符串长度的正确方法 - 您应该使用strlen代替。这将正确处理字符串终止符NUL
出现在char
数组末尾之外的某些情况。