C ++分段错误

时间:2011-11-20 22:25:41

标签: 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 and print the Array.
  for(int i=0; i<sizeof(A); i++){
    A[i] = rand()%99;
    cout << A[i] << " ";
  }
  return 0;
}

6 个答案:

答案 0 :(得分:8)

sizeof为您提供字节大小。要查找元素计数,请将数组大小除以元素的大小:

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

你正在做的事情是在整个过程中写入3次(在大多数系统上)数组的大小,这会导致段错误。

答案 1 :(得分:3)

这里有几个问题:

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

    for(int i=0; i < input; 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;
    }
    

答案 2 :(得分:1)

你甚至不应该使用数组。 std::vector<T>有一个构造函数vector(size_t n),可以创建n个元素。

答案 3 :(得分:0)

sizeof运算符以sizeof(char)的倍数返回其参数的大小。在您的平台上,int大于char,因此您走出数组的末尾并且未定义(读取非常糟糕)当您执行时去做。很高兴这只是一个错误。

答案 4 :(得分:0)

您不应该将newdelete关键字用于动态内存。我很惊讶这个编译因为输入不是常量。

答案 5 :(得分:0)

要拥有可变长度的数组int A [input];,你必须以恐怖的方式分配它:

在C中: <{1}}在你完成时记得int A* = malloc(input * sizeof(int));

在C ++中: <{1}}在你完成时记得free(A);