C基础知识:比较" * char"和" char [x]"用于创建字符串

时间:2014-10-08 22:54:03

标签: c string

一个非常基本的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;
}

上述计划的输出:

enter image description here

3 个答案:

答案 0 :(得分:1)

那是因为在这一行char *string = "ABCD";中你声明了一个指向char的指针,这个指针大小为8字节,在这行char string2[5] = "ABCD";中你声明一个由5个字符组成的数组char长度为1个字节,1 * 5 == 5 bytesstring2的大小为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数组末尾之外的某些情况。