【问题标题】:C memory allocationsC 内存分配
【发布时间】:2015-07-23 01:19:40
【问题描述】:

我想知道 C 编译器如何为您自己初始化的字符数组分配内存,例如:

char example[] = "An example string";

如果它是单个字符,它将是 8 byte,那么示例是 17 bytes 还是有更多,因为它需要 \0 来完成它?

或者它是否高估了它需要多少内存?

【问题讨论】:

  • example 是 18 个字节,而不是 17 个(你数过 NUL 终止符吗?)
  • 8 byte8 bit 你的意思是?
  • 字符串以\0 -null 字符结尾,而不是\n
  • \0 char 是编译器自动添加的空字符;而\n 是换行符,如果程序员没有指定,则不使用。
  • 因此,如果您将数组设置为字符串文字,则始终添加 NUL 终止符,并且它只是 8 位/1 字节的所有单个字符加上空终止符的 1 个字节?

标签: c arrays memory char


【解决方案1】:

这段代码:

#include <stdio.h>

int main(void)
{
    char example[] = "An example string";
    printf("%zu", sizeof(example));
}

编译:

gcc -std=c99 -o proof proof.c

返回:

18 (字节,而不是位)

因为字符串末尾有\0 字符

【讨论】:

    【解决方案2】:

    strlenn 的空 (\0) 终止字符串的大小为 n+1。正如你所说,空字符额外加一个。

    如果字符串没有终止,则像strlen 这样的标准调用将无法工作,因为它们会寻找终止的\0

    【讨论】:

      【解决方案3】:

      单个字符应该使用一个字节。

      字符串自动具有零终止符,并且需要比字符串中的字符多一个字节。如果您使用" ",则始终添加零终止符。

      您可以尝试使用strlenstrnlen

      char cSample = 'T'; // one byte
      
      char caSample[] = "T" //two bytes
      

      【讨论】:

        【解决方案4】:

        字符串大小为 18 字节,包括 '\0' 字符。但长度为 17。

        例如:

        char arr[]="";
        

        这里分配了空字符串,但它将有大小=1 字节,因为空字符'\0'。对于示例string ""长度为零

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多