簡體   English   中英

打印指針值的分段錯誤

[英]Segmentation fault on printing pointer value

當我嘗試打印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> )。

恭喜,你有堆棧溢出 :)

找到一種方法來增加堆棧的大小或只是動態分配數組:

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

/* do something */

free( v );

堆棧溢出 ! 如果你使用bash或者如果[t]csh limit stacksize請參閱ulimit -s

或者不使用堆棧,您可以將堆與malloc

你已經有了原因。 對於將分配v的程序堆棧, 5000000太大而無法處理。 你應該用malloc動態分配它。

程序的堆棧大小取決於編譯器開關,默認值不同於OS到OS。 在你的情況下,它聽起來好像堆棧太小,無法容納那么大的數字。 請參閱編譯器(鏈接器)開關以增加堆棧大小。

嘗試

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

正如其他人所說,堆棧溢出。 要了解代碼實際崩潰的原因和時間,這就是行之間的事情:

  • 嘗試在堆棧上分配5000000 * sizeof(int)。 我們假設這是20MB。
  • 編譯器(與鏈接器相對)很可能不知道堆棧有多大,所以它很樂意假設堆棧有20MB。
  • 調用printf()時,指針地址在堆棧上傳遞給函數。 編譯器將嘗試在堆棧位置0 + 20000004處推送此指針地址(4個字節)。這是在有效內存之外,此處程序將崩潰。
  • 如果編譯器使用另一個printf()調用約定,例如通過將指針地址傳遞給CPU寄存器,程序就不會崩潰,直到你真正嘗試從那個巨大的數組中讀/寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM