分段故障(核心倾倒)变量分配
Segmentation fault(core dumped) variable assignment
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。
- 是否可以使用其他变量为变量分配值,而无需在 C++ 中更改其值?
- 将字符串变量分配给无符号字符变量
- 将延迟变量分配给引用变量
- 为什么以下变量分配不正确
- 如何在 c++ 中将两个不同类型的变量分配给一个变量
- C++ 无法将字符数组变量分配给字符串变量
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- 识别矩阵变量分配的行为
- C 为什么在原始双阵列中的分配似乎比双变量分配要快得多
- C++:如何将 char 变量分配给向量<char>并访问该向量的元素进行比较?
- 将局部方法变量分配给类指针
- 类构造函数中的静态成员变量分配
- 如果条件语句中的变量分配
- C++ - 将一个变量分配给另一个变量和将变量分配给引用变量有什么区别?
- 需要帮助了解指针变量分配
- 从值捕获的变量分配到lambda参数时,GCC编译器分割故障
- 将非按引用变量分配给返回按引用的函数,反之亦然
- 通过结构指针访问结构变量分配错误数据
- 分段故障(核心倾倒)变量分配
- 在名称空间之外的C 中的外部变量分配值