#include#include using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; int main() { int a[3]; for(int i=0;i<4;i++){ a[i]=i+1; } ListNode*h = new ListNode(0); for(int i=0;i<4;i++){ ListNode*t =new ListNode(a[i]); t->next = h->next; h->next = t; cout<<"t "<val< val< next = h2->next; h2->next = t2; cout<<"t2 "< val<
这段构建结构体的代码,错误在a[]的初始化,应该初始化4个,a[4]。我的问题是为什么每一次,都会是上面的那个结构体的输出为符合预期的值呢?
int a[3]表示数组长度是3...
这是常识问题:
C/C++ 中数组下标是从 0 开始的,int a[sz];
定义了从a[0]
到a[sz-1]
这sz
个元素。
数组访问越界是未定义行为。
为什么每一次,都会是上面的那个结构体的输出为符合预期的值呢?
与编译器的实现有关,每个编译器对于未定义的行为采取的实现不一定相同。你的上面结构体中保存的是a[0]~a[3]
这 4 个元素,下面结构体保存的是a[1]~a[4]
这 4 个元素,其中对于a[3]
和a[4]
的访问均越界了,是未定义的行为。由于你之前循环赋值时把a[3]
越界赋值为 4(你的编译器实现为正常赋值,覆盖a[3]
所在内存的内容),而未越界赋值a[4]
(未赋值的内置类型局部变量其值是未定义的,换句话说,你的编译器实现为随机数),所以会出现截图中的结果。
实际编程时应禁止涉及未定义行为。