【问题标题】:What is the underlying mechanism of char array[] = "string"?char array[] = "string" 的底层机制是什么?
【发布时间】:2016-07-28 09:14:30
【问题描述】:

我知道在C中字符串赋值必须经过

char string[4];
strcpy(string, "aaa");

但是C为什么以及如何允许

char string[] = "string";

?

提前致谢

【问题讨论】:

标签: c string strcpy


【解决方案1】:
char string[] = "string";

这里,stringright 长度由编译器自动计算,以便为字符串和 NUL 字符留出足够的空间。

char string[4];
strcpy(string, "aaa");

如果字符串大于实际的string 容量,此处strcpy 可能会超出数组边界。

【讨论】:

  • 如果 strcpy 可以访问超出数组边界,这是否意味着它会根据字符串的大小为数组分配内存地址?
  • 不,它只是继续写入以下内存地址,被其他变量占用,产生未定义的结果。该技术用于缓冲区溢出攻击,因此如果您从用户给出的字符串执行 strcpy,您必须首先检查目标缓冲区的大小是否足够大。
  • @hemel:不,它不会调整数组的大小(您所说的):那是 您的 工作。它只是写超出了数组的边界,导致了 UB。
  • 那么如果数组占用的内存地址后面有一个占用内存地址,并且字符串很长,是否会损坏占用内存地址中的数据?
【解决方案2】:

你好像误会了什么。根据 gcc,您允许这样做:

char string[4] = "aaa";

char string[] = "aaa"; 的区别仅在于编译器从它的初始化器推断string 的长度。这里与其他类型的数组没有什么不同 - 只是您可以使用字符串文字作为初始值设定项而不是数组文字。

【讨论】:

  • 我为字符数组 char string[] = "aaa" 分配了一个字符串,但之后我可以更改内容。没有错误。
  • @FabioTurati 我删除了该段落,因此您对我最后一段的评论仅适用于不再存在的段落...
猜你喜欢
  • 2021-08-24
  • 2015-06-07
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2017-07-26
  • 1970-01-01
相关资源
最近更新 更多