关于指定C++代码输出及StorageArr[n]=arr[k]执行逻辑的问询
分析这段C++代码的问题与输出
首先贴出你提供的代码方便分析:
#include <iostream> #include <string.h> using namespace std; int main() { int num , n , n1 , k , x = 0; cout << "Enter the no. of vertices: " ; cin >> n; char StorageArr[n]; char arr[k]; for(k = 0; k< n ; k++){ cout<< "arr[" << k << "] : "; cin >> arr[k] ; StorageArr[n] = arr[k]; } int len = sizeof(StorageArr)/ sizeof(StorageArr[0]); cout << "The length of the array is : " << len << endl; for(int i= 0 ; i< len ; i++){ for(int j = 0; j< len ; j++ ){ cout<<"\n\t" <<"Element at " << StorageArr[i] << StorageArr[j] << ": " ; cin >> num; if(i==j && num == 0){ x++; } } } if(x == len){ cout<<"This is a complete graph..."; }else{ cout<< "This is not a complete graph..." ; } return 0; }
问题1:这段代码的输出结果是什么?
这段代码存在多处未定义行为和逻辑错误,输出结果完全不可预测,甚至可能直接崩溃,具体问题包括:
- 未初始化变量:
char arr[k];声明时k还没赋值,此时k是随机值,数组arr的大小不确定,写入时极大概率越界。 - 数组越界写入:
StorageArr[n] = arr[k];中,StorageArr是大小为n的数组,合法索引范围是0到n-1,访问StorageArr[n]属于越界写入,会破坏内存中其他变量的值(比如可能覆盖n、k或者x的存储),导致后续逻辑混乱。 - 错误的完全图判断逻辑:完全图的定义是任意两个不同顶点之间都存在边,但代码里只检查了对角线(顶点到自身的边)是否为0,完全偏离了判断标准。即使前面的内存问题没导致崩溃,最终的判断结果也几乎肯定是错误的。
- 非标准变长数组(VLA):
char StorageArr[n];属于C风格的变长数组,C++标准并不支持,不同编译器(比如GCC支持,MSVC不支持)的处理方式不同,进一步加剧了结果的不确定性。
如果侥幸程序没崩溃,可能会输出错误的数组长度(部分编译器对VLA的sizeof处理可能符合预期,但这不是标准行为),输入邻接矩阵元素时显示乱码(因为StorageArr的有效索引元素都是未初始化的随机值),最后输出错误的完全图判断结果。
问题2:StorageArr[n] = arr[k]的实际执行逻辑是什么?当输入n=5时,是全部赋值到同一位置还是依次存入0-4索引?
这段代码的逻辑是每次循环都把arr[k]的值赋值到StorageArr[n]这个越界的位置,当n=5时:
StorageArr的合法索引是0到4,StorageArr[5]是超出数组范围的内存地址。- 循环中
k从0到4,每次都会把当前输入的arr[k]覆盖写入到StorageArr[5],也就是说,最终StorageArr[5]的值是最后一次输入的arr[4],而StorageArr的有效索引0-4的元素完全没有被赋值,都是随机的垃圾值。 - 这种越界写入非常危险,可能会破坏其他变量的存储,比如如果
StorageArr[5]刚好是变量n的存储位置,那么n的值会被修改,导致后续循环的次数出错,甚至直接让程序崩溃。
内容的提问来源于stack exchange,提问作者Vaibhav Bisht
相关产品推荐
相关产品推荐

