2013-01-22 41 views
0

以下代碼對我有所幫助。嘗試printf大char時發生Segfault []

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    const int MEMSIZE = 1024*1024*10; 
    char memblock[MEMSIZE]; 
    memblock[10] = '\0'; 

    printf("%s", memblock); 

    return 0; 
} 

字符數組是否存在一定的大小限制?我忘記了所有的C,我在這裏做了些什麼愚蠢的事情?

+0

巧合的是,這是堆棧溢出(或下溢)的情況。 –

回答

3

字符數組的大小沒有限制,但堆棧大小與可用堆內存相比會相對受到限制。你可能在這裏溢出堆棧。你可以嘗試做memblock靜態

static char memblock[MEMSIZE]; 

或動態地分配它

char* memblock = malloc(MEMSIZE); 
if (memblock == NULL) { 
    printf("Error: failed to allocate %d byte buffer\n", MEMSIZE); 
    return -1; 
} 
memblock[10] = '\0'; 
printf("%s", memblock); 
free(memblock); 
+1

最好在寫入之前檢查返回到'memblock'的值。 – Maroun

+0

@MarounMaroun對。爲了簡潔,我忽略了這一點,但這可能是錯誤的電話。我已經添加了支票。 – simonc

+1

謝謝,這很有道理。對於讀這篇文章的其他人來說,將memblock聲明爲靜態需要我'#define MEMSIZE 1024 * 1024 * 10'。動態分配工作正常,但我得到了一個警告,直到我'#include ' – dwurf

5

發現什麼是你最大堆棧大小與這個小程序,並檢查您的數組是更大

#include <stdio.h> 
#include <sys/resource.h> 

int main() 
{ 
    struct rlimit rl; 
    int result = getrlimit(RLIMIT_STACK, &rl); 
    printf("max stack size: %u\n", rl.rlim_cur); 
} 

結果在我的主機上

max stack size: 10485760 

局部變量存儲在堆棧中,顯然它們不能大於其最大大小

+1

+1,很好的信息。在我的Ubuntu VM上,這是8MB,也可以通過'ulimit -s'找到 – dwurf

相關問題