2013-01-22 7 views
0

다음 코드는 segfaulting입니다.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

char 배열의 크기에는 제한이 없지만 스택 크기는 사용 가능한 힙 메모리에 비해 상대적으로 제한됩니다. 아마 여기 스택이 넘칠 것입니다. 당신은 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 True. 나는 간결함을 위해 이것을 건너 뛰었을 것이지만 그것은 아마도 여기에 잘못된 호출 일 것입니다. 지금 수표를 추가했습니다. – simonc

+1

감사합니다.이 말이 완벽합니다. 이것을 읽는 다른 사람들을 위해, memblock을 정적으로 선언하면'# 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 좋은 정보가 나올 때까지 경고 메시지가 나타납니다. 내 우분투 VM에서 이것은 8MB이며'ulimit -s '를 통해서도 찾을 수 있습니다. – dwurf

관련 문제