0

当我尝试打印v. 我试图理解为什么。有什么建议么?

#include <stdio.h>

int main() {

    int v[5000000];
    printf("\n\nv = %p", v);
     return 0;
}

编辑:如果不是分配 5000000 个元素,而是分配 500000 个或更少的元素,则程序不会出现段错误。

编辑(2):增加堆栈大小解决了这个问题。在 Linux 上,我在阅读 stephane-rouberol 的答案后增加了堆栈大小(使用ulimit -s <some_large_number>)。

4

6 回答 6

1

恭喜,你有堆栈溢出:)

找到一种方法来增加堆栈的大小或只是动态分配数组:

int* v = malloc( 5000000 * sizeof *v);

/* do something */

free( v );
于 2012-08-27T08:13:46.980 回答
1

堆栈溢出 !看看ulimit -s你是否使用bashlimit stacksize如果[t]csh

或者,您可以使用堆而不是使用堆栈malloc

于 2012-08-27T08:18:04.820 回答
0

你已经有了原因。对于将要分配5000000的程序堆栈来说太大而无法处理。v您应该使用动态分配它malloc

于 2012-08-27T08:15:16.960 回答
0

程序的堆栈大小取决于编译器开关,并且默认值因操作系统而异。在您的情况下,听起来好像堆栈太小而无法容纳这么大的数字。查看您的编译器(链接器)开关以增加堆栈大小。

于 2012-08-27T08:17:27.803 回答
0

尝试

printf("\n\nv = %p", (void *)v);
于 2012-08-27T08:17:38.940 回答
0

正如其他人所说,堆栈溢出。要了解代码实际崩溃的原因和时间,以下是两行之间的内容:

  • 尝试在堆栈上分配 5000000 * sizeof(int) 。假设这是 20MB。
  • 编译器(与链接器相反)很可能不知道堆栈有多大,因此它愉快地假设占用了 20MB 的堆栈。
  • 调用 printf() 时,指针地址在堆栈上传递给函数。编译器将尝试将该指针地址(4 字节)压入堆栈位置 0 + 20000004。这超出了有效内存,程序将在此处崩溃。
  • 如果编译器对 printf() 使用了另一种调用约定,例如通过在 CPU 寄存器中传递指针地址,程序就不会崩溃,直到你真正尝试从那个巨大的数组中读/写。
于 2012-08-27T08:43:45.330 回答