- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个大学任务的小程序:
#include <unistd.h>
#ifndef BUFFERSIZE
#define BUFFERSIZE 1
#endif
main()
{
char buffer[BUFFERSIZE];
int i;
int j = BUFFERSIZE;
i = read(0, buffer, BUFFERSIZE);
while (i>0)
{
write(1, buffer, i);
i = read(0, buffer, BUFFERSIZE);
}
return 0;
}
i = read(0, buffer, BUFFERSIZE);
(...)
main()
{
char buffer[BUFFERSIZE]; // SEGMENTATION FAULT HERE
int i;
int j = BUFFERSIZE;
i = read(0, buffer, BUFFERSIZE);
main()
{
int j = BUFFERSIZE; // SEGMENTATION FAULT HERE
char buffer[BUFFERSIZE];
int i;
i = read(0, buffer, BUFFERSIZE);
char buffer[BUFFERSIZE]; //NOW GLOBAL AND WORKING FINE
main()
{
int j = BUFFERSIZE;
int i;
i = read(0, buffer, BUFFERSIZE);
#uname -a
Linux hostname 3.2.0-34-generic #53-Ubuntu SMP Thu Nov 15 10:48:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
最佳答案
我认为这很简单:如果你试图让缓冲区太大,它就会溢出堆栈。
如果您使用 malloc()
分配缓冲区,我敢打赌你不会有问题。
注意有一个函数叫做 alloca()
显式分配堆栈存储。使用 alloca()
与声明堆栈变量几乎相同,只是它发生在程序运行时。阅读 alloca()
的手册页或对其进行讨论可能会帮助您了解您的程序出了什么问题。这是一个很好的讨论:
Why is the use of alloca() not considered good practice?
编辑:@jim mcnamara 在评论中告诉我们 ulimit
,一个可以检查用户限制的命令行工具。在这台计算机上(运行 Linux Mint 14,因此它应该与 Ubuntu 12.10 具有相同的限制)ulimit -s
命令显示堆栈大小限制为:8192 K-bytes,它很好地跟踪了您描述的问题。
编辑:如果不完全清楚,我建议您通过调用 malloc()
来解决问题.另一个可接受的解决方案是静态分配内存,只要您的代码是单线程的,它就可以正常工作。
您应该只对小缓冲区使用堆栈分配,正是因为您不想炸毁堆栈。如果您的缓冲区很大,或者您的代码将多次递归调用一个函数,以便多次分配小缓冲区,您将破坏您的堆栈并且您的代码将崩溃。最糟糕的是你不会得到任何警告:要么没问题,要么你的程序已经崩溃。malloc()
的唯一缺点|就是比较慢,所以不想打malloc()
内部时间关键代码。但这对于初始设置很好;一旦 malloc 完成,您分配的缓冲区的地址就是内存中的一个地址,就像程序地址空间中的任何其他内存地址一样。
我特别建议不要编辑系统默认值以使堆栈大小变大,因为这会使您的程序的可移植性大大降低。如果您调用标准 C 库函数,如 malloc()
您可以轻松地将代码移植到 Windows、Mac、Android 等;如果您开始调用系统函数来更改默认堆栈大小,那么移植会遇到更多问题。 (你现在可能没有移植这个的计划,但计划会改变!)
关于c - 段错误 : Stack allocation in a C program in Ubuntu when bufffer>4M,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13908033/
这是一个大学任务的小程序: #include #ifndef BUFFERSIZE #define BUFFERSIZE 1 #endif main() { char buffer[BUFF
我是一名优秀的程序员,十分优秀!