[英]clarification about double pointers - cannot explain the behavior
在准备期末考试时,我偶然发现了以下问题:鉴于这段代码:
#include <stdio.h>
int main() {
const char *const ptr1[] = {"to be", "or not to be", "that is the question"};
char *ptr2 = "that is the question";
(&ptr2)[3]="hamlet";
for (int i = 0; i < sizeof(ptr1) / sizeof(*ptr1); ++i)
printf("%s ", ptr1[i]);
return 0;
}
打印以下内容:“成为小村庄就是问题”
我认为这段代码不会编译。
但是,代码可以编译。
有人可以帮我理解为什么这段代码会这样吗?
它可能会编译,因为代码中没有任何内容需要编译器来诊断问题。
分配在类型正确的意义上起作用。 ptr2
有char*
类型,所以&ptr2
有char**
类型, (&ptr2)[3]
有char*
类型,我们可以分配一个字符串文字。
但是, ptr2
不是数组,因此无法在偏移量3
处访问它。 该程序具有未定义的行为,因此声明特定的 output 是没有意义的。
编译程序时启用警告和清理程序,看看有什么问题: https://godbolt.org/z/G67j6qr7a
代码编译,赋值本身就 C 语言语法和约束 go 有效。 但是,它会调用未定义的行为(请参阅什么是未定义的行为以及它是如何工作的? ),因为您越界访问变量ptr2
- 这是无稽之谈。 我没有得到你在我的编译器上声称的 output,只是因为这段代码没有确定性的结果。
在某些系统上,越界访问可能会生成对堆栈上先前声明的数组的访问,但不能保证这种行为。 大多数系统都有向下计数的堆栈,所以我认为它们中的很多最终不会像假设的那样修改指针数组。 此外,编译器可以自由地在彼此相关的任何地址分配ptr1
和ptr2
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.