c - char 数组如何处理较长的字符串?

标签 c arrays

我将这个问题作为多个问题之一提出 here .但是人们让我分别问他们。那么为什么要问这个问题。

考虑以下 code lines :

char a[5] = "geeks"; //1
char a3[] = {'g','e','e','k','s'}; //d
printf("a:%s,%u\n",a,sizeof(a)); //5
printf("a3:%s,%u\n",a3,sizeof(a3)); //j
printf("a[5]:%d,%c\n",a[5],a[5]);
printf("a3[5]:%d,%c\n",a3[5],a3[5]);

输出:

a:geeksV,5
a3:geeks,5
a[5]:86,V
a3[5]:127,

但是原始问题的输出是:

a:geeks,5
a3:geeksV,5

原始问题中的问题 1 是:

  1. Does line #1 adds \0? Notice that sizeof prints 5 in line #5 indicating \0 is not there. But then, how #5 does not print something like geeksU as in case of line #j? I feel \0 does indeed gets added in line #1, but is not considered in sizeof, while is considered by printf. Am I right with this?
  1. 当我只取出与原始问题中第一个问题相关的那些代码行时,意识到输出已经改变(对于同一个在线编译器),现在我怀疑这里发生了什么?我相信这些是 C 标准未定义的行为。有人可以阐明更多吗?可能用于其他编译器?

再次抱歉问了第二个问题。

最佳答案

char a[5] = "geeks"; //1

在这里,您将数组的大小指定为“5”,并用 5 个字符对其进行初始化。 因此,您没有“C 字符串”,根据定义,它以 NUL 结尾。 (0).

printf("a:%s,%u\n",a,sizeof(a)); //5

数组本身的大小仍然为 5,sizeof 运算符正确地报告了这一点,但是您对 printf 的调用是未定义的行为,并且可以在数组内容之后打印任何内容 - 它只会继续查看下一个地址,直到它在某处找到一个 0。这可能会立即发生,也可能会打印 1000000 个垃圾字符,或者可能导致某种段错误或其他崩溃。

char a3[] = {'g','e','e','k','s'}; //d

因为您没有指定数组的大小,编译器将通过初始化语法确定数组的大小。但是,您选择初始化 a3 的方式,它仍然只会提供 5 个字节的长度。 原因是您的初始化只是一个初始化列表,而不是“字符串”。因此,您随后对 printf 的调用也是未定义的行为,幸运的是,在您的情况下,在 a3[5] 位置似乎有一个 0。

实际上,两个示例都有完全相同的错误。

你可以这样改变它:

char a3[] = "geeks";

使用字符串字面量初始化未指定大小的数组将导致编译器分配足够的内存来保存字符串额外的 NUL 终止符,sizeof (a3) 现在将产生 6 .

关于c - char 数组如何处理较长的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53663688/

相关文章:

c - 如何设置 Gearmenu 的一个元素不敏感?

ios - C 代码可以编译成任何架构的静态库吗?

javascript - 如果包含特定单词,则从数组中返回匹配项

javascript - 递归循环对象树

PHP array_filter 带参数

上下文保存——如何读取C中的段寄存器和指令指针?

c - 在结构体中填充 int 数组

c++ - MS Visual C++ : When should you care about using calling conventions?

ruby-on-rails - Ruby on Rails 测试 - ActiveRecord::StatementInvalid: PG::InvalidTextRepresentation: ERROR: 格式错误的数组文字:

javascript - 用Javascript中设置的字典数组替换字符串中的字母