打印指针值的分段错误

时间:2012-08-27 08:11:33

标签: c

当我尝试打印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>)的答案后增加了堆栈大小。

6 个答案:

答案 0 :(得分:1)

恭喜,您有堆栈溢出:)

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

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

/* do something */

free( v );

答案 1 :(得分:1)

堆栈溢出! 如果您使用ulimit -sbash limit stacksize

,请参阅[t]csh

或者不使用堆栈,您可以将堆与malloc

一起使用

答案 2 :(得分:0)

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

答案 3 :(得分:0)

程序的堆栈大小取决于编译器开关,默认值不同于OS到OS。在你的情况下,它听起来好像堆栈太小,无法容纳那么大的数字。请参阅编译器(链接器)开关以增加堆栈大小。

答案 4 :(得分:0)

尝试

printf("\n\nv = %p", (void *)v);

答案 5 :(得分:0)

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

  • 尝试在堆栈上分配5000000 * sizeof(int)。我们假设这是20MB。
  • 编译器(而不是链接器)很可能不知道堆栈有多大,所以它很乐意假设堆栈有20MB。
  • 调用printf()时,指针地址在堆栈上传递给函数。编译器将尝试在堆栈位置0 + 20000004处推送此指针地址(4个字节)。这是在有效内存之外,此处程序将崩溃。
  • 如果编译器对printf()使用了另一个调用约定,例如通过将指针地址传递到CPU寄存器中,则程序不会崩溃,直到您实际尝试从该巨大数组读取/写入。