如何以字节为单位获取字符串大小?

art*_*rxe 25 c arrays sizeof

正如标题所暗示的,我的问题是如何获得字符串的大小C.sizeof如果我在没有malloc它的函数中声明它(字符串),那么使用它是否合适?或者,如果我已将其声明为指针?如果我用它初始化malloc怎么办?我想做一个详尽的回复.

nmi*_*lov 42

你可以使用strlen.大小由终止空字符决定,因此传递的字符串应该是有效的.

如果你想得到内存缓冲区的大小,它包含你的字符串,你有指向它的指针:

  • 如果它是动态数组(使用malloc创建),则无法获得它的大小,因为编译器不知道指针指向的是什么.(检查一下)
  • 如果是静态数组,则可以使用它sizeof来获取其大小.

如果您对动态和静态数组之间的区别感到困惑,请检查此项.

  • 实际上大小是`strlen()+ 1`(终止字符为1) (15认同)
  • @ 0x69***的大小通常定义为排除null终止符. (7认同)
  • @artaxerxe:C定义`char`是1个字节,但它没有定义一个字节是8位.因此,虽然`char`总是一个字节,就C而言,它不一定是八位字节,而且C标准之外的大部分世界认为"字节"意味着"八位字节".`char`大于8位的C实现属于少数,但包括许多DSP.由于各种原因,许多"便携式"代码无论如何都不会在DSP上运行,因此您可以决定是否要假设一个字节是8位.值"CHAR_BIT"肯定会告诉您. (4认同)
  • @modifiablelvalue暗示 - 直接从动态数组中获取大小是不可能的.当然你可以存储大小,但这不是重点. (3认同)
  • @Dukeling Hm ...然后用`memcpy`将`strlen()`字节复制到其他(非空)缓冲区并打印出来.您将看到的将是您的新字符串+垃圾.这是我的理由,字符串大小以字节为单位是"strlen()+ 1".(但是字符串_length_是`strlen()`). (2认同)

Duk*_*ing 13

使用strlen获得的长度空终止字符串.

sizeof返回数组的长度而不是字符串.如果它是一个指针(char *s),而不是一个数组(char s[]),它将无法工作,因为它将返回指针的大小(通常在32位系统上为4个字节).我相信一个数组将作为指针传递或返回,因此您将失去sizeof用于检查数组大小的能力.

因此,只有当字符串跨越整个阵列(例如char s[] = "stuff"),将使用sizeof一个静态定义的数组返回你想要什么(会更快,因为它不会需要遍历找到空终止符)(如果最后一个字符是一个空终止符,你需要减去1).如果它没有跨越整个数组,它将不会返回您想要的内容.

所有这一切的替代方案实际上是存储字符串的大小.

  • 请注意,`sizeof`实际上并不能为您提供字符串的长度.对于字符串文字,`sizeof`包含空终止符.对于`char`数组,`sizeof`给出数组中元素的数量(这是一个不可预测的数量,大于数组内容的字符串长度) (3认同)

hyd*_*yde 10

虽然sizeof此特定字符串类型的作品:

char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
Run Code Online (Sandbox Code Playgroud)

如果str是指针(sizeof返回指针的大小,通常是4或8)或具有指定长度的数组(sizeof将返回匹配指定长度的字节数,对于char类型相同),它不起作用.

只是用strlen().


小智 5

如果你使用sizeof()then a char *strandchar str[]将会返回不同的答案。char str[]将返回字符串的长度(包括字符串终止符),同时char *str将返回指针的大小(因编译器而异)。