人生不像做饭,不能等万事俱备了才下锅
今天在使用new创建动态数组时出现“缓存区溢出”
和“读取数据无效”
的警告,警告如下:
代码如下:
void test(int n)
{
//int n = 5;
int* nums = new int[n];
nums[0] = 1;
nums[1] = 2;
//cout << nums[1] << endl;
}
int main()
{
test(5);
return 0;
}
首先是缓存区溢出,直接运行VS会发出警告“警告C6386 写入到“nums”时缓冲区溢出: 可写大小为“n*4”个字节,但可能写入了“8”个字节。”
,但是可以正常运行。当取消int n = 5;
的注释,或者直接将n改为5
时,警告消失。
然后是读取的数据无效的警告,当取消cout << nums[1] << endl;
的注释,也就是输出数组头指针的下一个值时VS会发出警告“警告 C6385 从“nums”中读取的数据无效: 可读大小为“n*4”个字节,但可能读取了“8”个字节。”
但是可以正常输出。
猜测可能是因为编译器在分配内存时无法确定n的值,所以分配的是n个字节的连续空间?但是也可以正常赋值和输入,求大佬解答