段故障(核心转储)变量赋值(Segmentation fault(core dumped) vari

2019-10-19 07:09发布

我用C ++编写的程序,与G ++编译,在Ubuntu 13.04运行的32个比特,即是给以下错误:“分段故障(核心转储)”。

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];

当([1] - 一个通过的argv带来)中的“则n_frames”值较低(试验直至300)的错误不会发生和一切顺利。

当该值较高(如1922)中出现错误。 当错误发生时显示的最后的printf是第四之一的“printf(” 4 \ n“)”。

当该值是1853或降低的“printf(” 5 \ n“)”被示出,但下一个的printf不会显示出来。

任何人有什么可以解决它的主意? 有什么能分割故障源(核心转储)在节目中的一个如此简单的一步....

Answer 1:

您的frames阵列使用通过在命令行上的用户通过在动态大小在堆栈上创建的。 你已经脱离了标准C ++领土这里使用分机/ C99ism简称“变长数组”。

此外, n_frames重视你在(1922)通过使帧阵列1922 * 377 * 10个字节长,即大约7.5 MB。 在几乎任何标准的台式机/笔记本机/ OS,你的堆栈大小限制为大约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的实际动态分配的数组类++。



Answer 2:

这是一个堆栈溢出。 您使用的数目可变长度阵列(VLA)的和则n_frames的大的值,在使栈溢出。 使用动态分配的内存代替。

我怀疑你甚至不知道你用沃拉斯。 他们是一个非常简单的功能,误操作,除非你真的了解自己使用的全部含义,你应该避免使用它们。

您的代码看起来更象C比C ++。 在我看来,现在是时候让你学习如何做事的C ++的方式。 你真的应该避免原始内存分配。 而且你当然也不应该是调用printf和永远不会调用的atoi。



文章来源: Segmentation fault(core dumped) variable assignment