微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我尝试使用 typedef 定义一个动态增长的数组,它最多可以工作 79 个索引,除此之外它没有,有人可以解决这个问题吗?

如何解决我尝试使用 typedef 定义一个动态增长的数组,它最多可以工作 79 个索引,除此之外它没有,有人可以解决这个问题吗?

没有给出明确的大小,它可以工作到索引 79。它在索引 79 处打印值 200,但是当我将索引增加 1 即 80 时,它什么也不打印并且程序终止。

#include <iostream>
using namespace std;

typedef int list[];
int main() {
   list myList{};
   myList[79]={200};
   cout<<myList[79]; // OUTPUT: 200
   return 0;
}
#include <iostream>
using namespace std;

typedef int list[];
int main() {
   list myList{};
   myList[80]={200};
   cout<<myList[80]; // No Output and Process finished with exit code -1073741819 (0xC0000005)
   return 0;
}

解决方法

首先,尝试执行以下操作:

list myList {};
cout << sizeof(myList) << endl;
// Prints 0,since no elements 
// Note,the number does not signifies the number of elements,// it signifies the number of bytes.

int foo[] 不是一个动态增长的数组,它是 C 的遗产,并且尽可能地原始。当您为数组添加下标时,它不会在索引处添加元素(也不会添加到索引处)。

当您执行 myList[79]={200}; 时,它不会创建元素,尤其不会将数组填充到此索引。在这里,您的程序只是尝试访问一个越界内存位置(并写入它,这可能是其中最糟糕的部分)。不管是79还是80,都会导致undefined behavior

请注意,T foo[] 数组对其用户或其中的任何内部智能都没有说服力,它们代表原始内存。没有边界检查,没有隐式或显式的分配内存增长。

由程序员使用这种类型来确保下标值在允许的范围内(直到数组的预定大小)。

这就是为什么 C++ 程序员应该为任何现实世界的应用程序使用任何合适的标准库容器

,

对于初学者来说,代码不是合法的 C++。如果您的编译器接受它,那么您的编译器设置不够严格。

如果您的编译器接受它,那么它会将其视为零大小数组,而不是“动态增长数组”,这不是什么。

您正在越界访问数组,因此行为不明确(就像它适用于无效的 C++ 一样)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。