分段错误(核心转储)变量赋值

时间:2014-02-02 21:24:23

标签: c++ variable-assignment

我有一个用C ++编写的程序,用G ++编译,运行在Ubuntu 13.04 32位,这会产生以下错误:“Segmentation fault(core dumped)”。

int main(int argc, char *argv[]){
printf("1\n");
int x = 0 , y = 0, count = 0;
printf("2\n");
char c;
printf("3\n");
int n_frames = (atoi(argv[1]) - 1);
printf("4\n");
int windowSize = WINDOW_SIZE; // WINDOW_SIZE is a define
printf("5\n");
// And the program go on....

long double frames[n_frames][377];

long double dis_frames[n_frames - (windowSize - 1)];
int tam_dis_frames = n_frames - (windowSize - 1);
long double white_top_hat[tam_dis_frames];

当“n_frames”值(argv [1]带来的值)较低(测试到300)时,错误不会发生,一切都很顺利。

当值更高(如1922)时,错误发生。当错误发生时,显示的最后一个printf是第四个,“printf(”4 \ n“)”。

当值为1853或更低时,显示“printf(”5 \ n“)”但下一个printf不会显示。

任何人都知道什么可以解决它?在一个如此简单的程序步骤中,可能是分段错误(核心转储)的来源......

2 个答案:

答案 0 :(得分:2)

使用用户在命令行传入的动态大小在堆栈上创建frames数组。你已经超出了标准的C ++领域并使用了扩展/ C99ism,称为“可变长度数组”。

此外,您传入的n_frames值(1922)使得帧数组长1922 * 377 * 10个字节,即大约7.5 MB。几乎任何标准的台式机/笔记本电脑/操作系统,你的堆栈大小限制大约是1MB,所以你有两种不同的方式。

对您的问题的明显,直接的解决方案是动态分配frames,如下所示:

long double** frames = new (long double*)[n_frames];
for (int i = 0; i < n_frames; ++i) {
  frames[i] = new long double[377];
}

...当然不要忘记最后的相应delete []

然而,就是说,您可能想要了解std::vector作为C ++中事实上动态分配的数组类。

答案 1 :(得分:1)

这是堆栈溢出。您正在使用多个可变长度数组(VLA),并且对于大的n_frames值,您会溢出堆栈。改为使用动态分配的内存。

我怀疑你甚至没有意识到你在使用VLA。它们是一个非常容易滥用的功能,除非你真正理解它们使用的全部含义,否则你应该避免使用它们。

您的代码看起来更像C而不是C ++。在我看来,是时候学习如何用C ++方式做事了。你应该真的避免原始内存分配。而你当然不应该打电话给printf而且永远不要打电话给atoi。