【问题标题】:C basics: comparing "*char" and "char[x]" for string creationC 基础:比较 "*char" 和 "char[x]" 以创建字符串
【发布时间】:2014-10-08 22:54:03
【问题描述】:

一个非常基本的 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 字节的指针。)

方法一:

char *string = "ABCD";

方法二:

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;
}

上述程序的输出:

【问题讨论】:

标签: c string


【解决方案1】:

那是因为在这一行 char *string = "ABCD"; 你声明了一个指向 char 的指针,它的大小为 8 个字节,而在这一行 char string2[5] = "ABCD"; 你声明一个 5 个字符的数组,因为 char 是 1 个字节长和1 * 5 == 5 bytes 那么string2 的大小将是5 个字节

【讨论】:

  • 这可能是一个愚蠢的问题,但您能否详细说明为什么指向 char 的指针的大小比它所指向的类型大 8 倍(或者如果考虑 ABCD 中的四个字符,则大 2 倍? ,即不包括/0)? (我明白为什么char string2[5] = "ABCD" results 的大小为 5 个字节。)
  • 因为指针存储的是内存地址而不是字符,而且内存地址通常是 8 个字节
  • 我明白了,谢谢。我想我很困惑,因为其他线程中的一些响应暗示指针仅占用 4 个字节的内存,这确实是 32 位的情况,但不是 64 位(我正在运行后者) .
【解决方案2】:

一个 char 只需要保存一个 ASCII 值,这是一个非常小的数字范围,所以它们每个只占用 1 个字节。

char* 是指向内存地址的指针,它的数字范围要大得多,因此需要更多的字节来存储它。一个指针在 32 位系统上占用 4 个字节,在 64 位系统上占用 8 个字节。

我认为您在 64 位系统上运行?我想这就是为什么它是 8 个字节。

【讨论】:

    【解决方案3】:

    在您的第一个示例中,您声明了一个变量,它是指向char 的指针。因此,当您使用 sizeof 获取它的大小时,您会得到指针的大小(而不是它所指向的东西的大小),在 64 位平台上是 8 个字节。

    在第二个示例中,您声明了一个变量,该变量是char 的数组。在 C 中,sizeof 数组的作用与您期望的一样 - 它以字节为单位返回数组的大小,在本例中为 5 * sizeof(char)(因为您声明了一个 5 字符数组),即 5(因为 @987654327 @)。

    在任何一种情况下,使用sizeof 通常不是测量字符串长度的正确方法 - 您应该改用strlen。这将正确处理字符串终止符 NUL 出现在 char 数组末尾以外的位置的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多