分段故障(核心倾倒)变量分配

Segmentation fault(core dumped) variable assignment

本文关键字:变量 分配 故障 核心 分段      更新时间:2023-10-16

i有一个用C 编写的程序,用G 编译,在Ubuntu 13.04 32位运行,这给出了以下错误:"分段故障(核心丢弃)。

"。
int main(int argc, char *argv[]){
printf("1n");
int x = 0 , y = 0, count = 0;
printf("2n");
char c;
printf("3n");
int n_frames = (atoi(argv[1]) - 1);
printf("4n");
int windowSize = WINDOW_SIZE; // WINDOW_SIZE is a define
printf("5n");
// 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," printf(" 4 n")。

当值为1853或降低时,显示" printf(" 5 n")",但下一个printf不会显示。

有人知道什么可以解决?在程序的一个简单步骤中,分割故障的来源可能是什么....

使用用户在命令行上传递的动态大小在堆栈上创建您的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 中的事实分配的数组类。

这是一个堆栈溢出。您使用的是许多可变长度阵列(VLA),对于大量的n_frame,您溢出了堆栈。改用动态分配的内存。

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

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