Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;分段断层_C++_Segmentation Fault - Fatal编程技术网

C++ C++;分段断层

C++ C++;分段断层,c++,segmentation-fault,C++,Segmentation Fault,我读过关于分段错误的文章,但不明白为什么分段错误是由以下代码引起的 #include<iostream> #include <stdlib.h> using namespace std; int main(){ int input; cout << "Enter length of desired array." << "\n"; cin >> input; int A [input]; //Populate

我读过关于分段错误的文章,但不明白为什么分段错误是由以下代码引起的

#include<iostream>
#include <stdlib.h>

using namespace std;

int main(){
  int input;
  cout << "Enter length of desired array." << "\n";
  cin >> input;

  int A [input];

  //Populate and print the Array.
  for(int i=0; i<sizeof(A); i++){
    A[i] = rand()%99;
    cout << A[i] << " ";
  }
  return 0;
}
#包括
#包括
使用名称空间std;
int main(){
int输入;
不能输入;
INTA[输入];
//填充并打印数组。

for(int i=0;i
sizeof
提供以字节为单位的大小。若要查找元素计数,请将以字节为单位的数组大小除以元素的大小:

for(int i=0; i < sizeof(A) / sizeof(A[0]); i++)
for(inti=0;i

基本上,您要做的是(在大多数系统上)将数组的大小写3倍,这会导致segfault。

sizeof
运算符返回其参数的大小,以
sizeof(char)的倍数表示
。在您的平台上,一个
int
比一个
char
大,因此您正在离开数组的末尾,这样做时会发生未定义(读起来非常糟糕)的事情。很高兴这只是一个seg错误。

这里有几个问题:

你使用的是可变长度数组。在C++中是不允许的。所以它必须是编译器扩展。
  • sizeof(A)
    返回以字节为单位的大小,而不是元素数。因此,您正在溢出数组。您需要将其除以每个元素的大小
  • 您应该将循环更改为:

    for(int i=0; i < input; i++){
    
    for(int i=0;i

    编辑:这里有一个不使用可变长度数组的解决方案:

    int main(){
        int input;
        cout << "Enter length of desired array." << "\n";
        cin >> input;
    
        int *A = new int[input];   //  Allocate
    
        //Populate and print the Array.
        for(int i=0; i<sizeof(A); i++){
            A[i] = rand()%99;
            cout << A[i] << " ";
        }
    
        delete[] A;    //  Free the allocated memory
    
        return 0;
    }
    
    intmain(){
    int输入;
    不能输入;
    int*A=newint[input];//分配
    //填充并打印数组。
    
    对于(int i=0;i您不应该使用
    new
    delete
    关键字作为动态内存。我很惊讶这会编译为输入不是常量。

    要拥有可变长度数组,
    int A[input];
    您必须手动分配它:

    在C中:
    inta*=malloc(input*sizeof(int));
    完成后记得
    free(A);

    在C++中:
    int A*=new int[input];
    完成后记得
    删除[]A;

    甚至不应该使用数组。
    std::vector
    有一个构造函数
    vector(大小)<代码> > <代码> n>代码>元素。< /p>正常情况下,C++中不能有一个可变大小的数组。哪个编译器是这个?我不知道输入是什么;CIN确实把数字转换成整数。int可能太大。我假设你已经确定输入确实是整数>0 C++(=C)。当代C++有两个构造函数:一个是代码>向量(sisixt n)和一个<代码>向量(siZeZT n,t>)< /> >没有多余的拷贝!CPAuxEng.com有点过时了。你的意思是“代码>向量(siZeZT n,t&t,alc&a=alOrthor))/>代码(参见矢量[CONS])(23.3.62).Strage,cppreference应该是最重要的…希望很快。不确定如何为该网站做出贡献。对不起,我是说cplusplus.com。cppreference很好而且更新了,我在我的
    ~
    中有一个它的本地副本,我使用它作为C++11合规性的主要文档。当然,当它与ISO 14882冲突时,ISO 14882将取代.V可变长度?抱歉,如果这看起来很愚蠢,我将从java中移动。可变长度数组意味着一个数组,它没有在编译时可以确定的大小。在这种情况下,数组的大小是在运行时从用户输入确定的。因此,它是一个可变长度数组。那么C++中我该怎么做呢?
    vector
    使用
    new
    int
    数组进行分类或分配(请确保稍后使用
    delete
    释放),搜索确切语法应该很容易。