2012-10-27 2 views
0

char 버퍼의 최대 크기는 있습니까? char 버퍼의 문자열을 수집하고 proc 파일에 쓰는 프로그램이 있습니다. 어떤 시점 이후에 글쓰기를 멈추는 것처럼 보입니다. 거기에 너무 많이 있습니까? 최대 크기는 얼마입니까? 그래서이 문제를 해결할 수 있습니까?C에서 char 버퍼의 최대 크기?

다음은 코드입니다. 이것은 LKM입니다 - limits.h는 커널 공간에서 사용할 수 있습니까? 제일

:

const char* input = "hooloo\n"; 

다음 :

int read_info(char *page, char **start, off_t off, int count, int *eof, void *data) 
{ 

    unsigned int mem; 
    char answer_buf[strlen(input) + 1 + 14]; 
    name_added = vmalloc(strlen(input) + 1 + 14); 
    strcpy(name_added, input); 
    strcat(name_added, extension); 
    mem = sprintf(answer_buf, "%s\n", name_added); 
    memcpy(page, answer_buf, mem); 
    return strlen(answer_buf) + 1; 
} 

은 내 모든 코드에서 이런 일들이 버퍼를 remalloc과 추가 것들이다. 또한 read_info는 procfile 용입니다. 이 문제는 위의 코드를 계속해서 버퍼에 계속 추가하는 것입니다. 결국 필자는 procfile과 텍스트를 잘라 내고, 끝내지 않습니다. - 내가 원하는 것처럼 영원히 계속하지 않습니다.) =.

+3

코드를 표시하십시오. 'buffer'는 정적 배열인가,'malloc'인가요? –

+0

문자열 크기는 항상 두통입니다 ... 일반적으로 사용 및 실행 플랫폼에 의해 근사값이 계산됩니다. 자주 사용하는 두 가지 크기는 255와 10000입니다. – texasbruce

+0

'begin_input'은 얼마나 오래 걸리나요? 'char answer_buf [strlen (begin_input) + 1 + 14];가 커지면 스택이 오버 플로우 될 수 있습니다. –

답변

2

"C"의 구체적 최대 크기는 구체적으로 없습니다. C 플랫폼의 모든 객체의 이론적 (또는 "잠재적") 최대 크기는 구현에 의해 결정되며 일반적으로 기본 시스템 플랫폼 및 OS의 속성에서 파생됩니다.

플랫 메모리 모델이있는 플랫폼에서는 일반적으로 이론적으로 주소 공간의 크기와 사용 가능한 사용 가능한 메모리 (또는 특정 종류)의 크기에 따라 제한됩니다.

세그먼트 화 된 메모리 모델이있는 플랫폼에서는 세그먼트 크기가 주소 공간 크기보다 작을 수 있습니다. 코드의 플랫 메모리 모델을 "에뮬레이트"함으로써 구현이 제한을 위반하지 않아도됩니다. 이러한 플랫폼에서 최대 오브젝트 크기는 컴파일 설정에 따라 달라질 수 있습니다.

2

동적으로 할당되는 char 버퍼의 유일한 최대 크기는 사용 가능한 시스템 메모리입니다.

스택의 버퍼 크기는 최대 스택 크기로 제한됩니다. 이는 호스트 OS에 따라 크게 달라집니다.

파일에 데이터를 쓸 때 fwrite에서 반환 된 크기를 확인하고 필요하면 반복적으로 버퍼를 쓰고 있습니까?

+2

'buffer'가 정적으로 크기가 지정된 배열 인 경우 시스템 메모리 한계에 도달하기 전에 일반적으로 스택 크기 제한에 도달합니다. 대답은 동적으로 할당 된 버퍼에 맞습니다. – Praetorian

+0

좋은 지적, 고마워. 그에 따라 내 대답을 업데이트했습니다. – simonc

-3

나는 1000 개 고유 한 문자

-1

당신은 당신의 코드에서 메모리 누수가 처리 할 적어도 수 말하고 싶지만!

다음의 메모리가 해제되지 않습니다 :

name_added = vmalloc(strlen(input) + 1 + 14); 

전혀 출력 메모리를 할당 왜 이해가 안 돼요. 그리고 스택과 힙에서 두 번 수행합니다.

발신자가 출력을위한 버퍼를 제공했습니다. 사용하십시오! 복사본을 만들지 마십시오!