Netbeans c/c++ 编译器数组从 1 开始,而不是从 0 开始
Netbeans c/c++ compiler array start at 1 instead of 0
这是一个
简化的代码来解释这个问题:
int *nums[10];
*nums[0] = 5;
cout << *nums[0] << endl;
代码已编译,但在执行时失败。所以我试了这个:
int *nums[10];
*nums[1] = 5;
cout << *nums[1] << endl;
它打印出来很好。我发现数组是从 *nums[1] 到 *nums[10] 开始的而不是通常的 *数字[0] 到 *数字[10]。我已经与使用 Netbeans C/C++ 编译器的其他人进行了检查,他们的编译器可以正常工作。我假设它是特定编译器中更改的一些首选项。如何更改它以使其按应有的方式工作?
数组
从 0 开始。您遇到了未定义的行为。
int *nums[10];
创建一个包含 10 个指向 int
的未初始化指针的数组。
*nums[0] = 5;
取消引用未初始化的指针。任何事情都可能发生。要使其按预期运行,请在访问指针之前分配内存:
for ( int i = 0 ; i < 10 ; i++ )
nums[i] = new int;
并在最后删除它:
for ( int i = 0 ; i < 10 ; i++ )
delete nums[i];
例如,我在 MSV 中收到警告:
警告 C4700:使用了未初始化的局部变量"nums"
还有一个崩溃:)。
在 C/C++ 中,数组始终是 0 索引的。
我假设你想创建一个整数数组。如果你想创建一个指向整数的指针数组,请查看Luchian的答案。
您声明了一个包含 10 个指向整数值的指针的数组。您没有为实际值分配内存。这就是您收到错误的原因。
您需要为整数分配内存。为此,您有两种方法:
int nums[10];
nums[0] = 5;
cout << nums[0] << endl;
或
int* nums = new int[10];
nums[0] = 5;
cout << nums[0] << endl;
delete[] nums; // don't forget to delete
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 如何从头开始创建 avi 文件?
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 自一周开始以来的秒数?
- 一旦双簧管录制开始,主 UI 线程就会被阻止
- GStreamer在开始任何播放之前进行搜索
- 使 std::fstream 写入文件末尾,但从头开始读取
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 哪个C++规范开始支持 std::vector
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 如何在调试中通过传递引用开始
- 如何使用 picojson.h 在 c++ 中从头开始创建 json 对象
- 从特定键开始遍历地图
- 列表的有效性在插入后开始迭代器
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 试图修复一个错误,该错误不会让我开始编程其余部分
- 甚至在开始执行之前出现分段错误
- 为什么 Glib::VariantBase::store 方法破坏了给定缓冲区的开始