c++ - CPP struct 的诡异问题

 膈应人的ID 发布于 2022-11-03 17:39
#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]。我的问题是为什么每一次,都会是上面的那个结构体的输出为符合预期的值呢?

2 个回答
  • int a[3]表示数组长度是3...

    2022-11-12 01:55 回答
  • 这是常识问题:

    1. C/C++ 中数组下标是从 0 开始的,int a[sz];定义了从a[0]a[sz-1]sz个元素。

    2. 数组访问越界是未定义行为。

    为什么每一次,都会是上面的那个结构体的输出为符合预期的值呢?

    与编译器的实现有关,每个编译器对于未定义的行为采取的实现不一定相同。你的上面结构体中保存的是a[0]~a[3]这 4 个元素,下面结构体保存的是a[1]~a[4]这 4 个元素,其中对于a[3]a[4]的访问均越界了,是未定义的行为。由于你之前循环赋值时把a[3]越界赋值为 4(你的编译器实现为正常赋值,覆盖a[3]所在内存的内容),而未越界赋值a[4](未赋值的内置类型局部变量其值是未定义的,换句话说,你的编译器实现为随机数),所以会出现截图中的结果。

    实际编程时应禁止涉及未定义行为。

    2022-11-12 01:55 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有