2011-08-14 2 views
4

printf가 계산 된 인수를 저장하는 데 사용할 수있는 메모리 제한은 무엇입니까? 인수를 저장하기 위해 어떤 명령 (변수 번호와 함께)에 사용할 수있는 일반 메모리 크기는 얼마입니까?printf의 내부 부분

예제 코드 :

#include <stdio.h> 

#include <stdlib.h> 


int main(int argc, char *argv[]) 

{ 

//by default the decimal is considered as double 

float a = 0.9; 

//long double b = (long double)23455556668989898988988998898999.99 ; 

long double b = 5.32e-5; 

double z = 6789999000000.8999; 


//b = (long double)1.99999999; 

printf("float %f, \n double %lf,\n long double %Lf\n\n\n", b, b, b); 

printf("simple: long double %Lf, double %lf, float %f\n\n\n", b,b,b); 

printf(" sumi: float %f, double %lf, long double %Lf\n\n\n", z, z, z); 

printf("test2 for le/lg/lf: dbl f %Lf, double g %Lg, double e %Le\n\n\n", b, b, b); 

    system("PAUSE"); 

    return 0; 

} 
+0

예 기대하지 않을 것이다 : – Nik

+0

#INCLUDE int 주 (int argc, 숯불 *는 argv []) {#include를 // 긴 이중 B = (긴 더블) 23455556668989898988988998898999.99; long double b = 5.32e-5; double z = 6789999000000.8999; // b = (long double) 1.99999999; printf ("float % f, \ n 이중 % lf, \ n 긴 이중 % Lf \ n \ n \ n", b, b, b); printf ("단순 : long double % Lf, double % lf, float % f \ n \ n \ n", b, b, b); printf ("sum : float % f, 이중 % lf, 긴 double % Lf \ n \ n \ n", z, z, z); printf ("le/lg/lf에 대한 test2 : dbl f % Lf, 이중 g % Lg, 이중 e % Le \ n \ n \ n", b, b, b); 시스템 ("PAUSE"); \t return 0; } – Nik

+0

"수정"링크를 사용하여 코멘트에 게시하는 대신 질문에 코드를 추가 할 수 있습니다. –

답변

0

printf에 전달할 수있는 모든 유형의 인쇄를 지원하기위한 최소 메모리 요구 사항은 1535 지수를 long double에 가정 할 때 약 6k 스택 공간입니다. 비 부동 소수점 유형의 경우 200 바이트 이하로 얻을 수 있습니다.

물론 실제 구현은 대부분 효율적이지 않습니다. glibc는 최소한 을 printf의 일부로 수행하며 적어도 일부 형식의 경우에는 예측할 수없는 오류가 발생합니다. 지금까지 내가이 말할 수있는 단지 게으른 코딩은 ... 아무 생각이 무엇 MS의 printf 않지만 나도 거기에 품질 코드 ... 크기가 초과 코드의

+0

또한 첫 번째 단락에서 인용 한 사용법 인수 당 "가 아니라"최대 사용 "입니다. 하나의 인수가 변환되어 출력되면 작업중인 데이터를 처리 할 필요가 없습니다. printf는 다음 페이지로 넘어갈 수있다. 메모리 사용이 인수의 수에 비례하여 증가하는 유일한 방법은'printf'가 내부적으로 모든 인수, 인수 유형 또는 형식 지정자를 저장하는 구조를 만드는 경우입니다. glibc는 비표준 확장을 위해 이것을하지만, POSIX i18n ('% N $'type) 형식 문자열 처리에도 유용 할 수 있습니다. –

2

특별한 제한이 없다. 과도한 #/인수에서 가장 큰 위험은 우연히 스택이 오버플로되는 것입니다.

"stackoverflow.com"에 대한 좋은 질문이 ;-)

+0

구현을 찾을 수있는 링크를 지정할 수 있습니까? – Nik

+0

glibc 또는 [uClibc] (http://uclibc.org/) 소스를 찾으십시오. –

+0

소스 코드를 포함하여 Windows C 런타임 라이브러리가 VisualStudio와 함께 제공됩니다. 설치시 해당 확인란을 선택하십시오. Linux 또는 GNU C 라이브러리는 http://www.gnu.org/software/libc/ (소스 코드는 물론)에서 찾을 수 있습니다. – Codo

0

고정 된 제한이 없습니다 무엇. 일부 시스템은 스택이 몇 바이트 (어쩌면 128 또는 256)이고 다른 스택은 메가 바이트 (mebibytes)입니다. 어떤 것은 함수에 의해 사용되는 힙을 가지고 있으며, 다른 것들은 그렇지 않습니다. 일부 내부 함수는 정적 메모리를 사용하고 다른 구현은 그렇지 않습니다.

+0

구현을 찾을 수있는 링크를 지정할 수 있습니까? – Nik

+0

@Nik : 어떤 OS/libc입니까? –

+0

windows 7, gcc 컴파일러 – Nik

1

일반적으로 인수는 호출 스택으로 이동하므로 단일 스레드 응용 프로그램에서 가장 중요한 제한은 스택 크기입니다. Posix에서는 getrlimits()을 사용하여 크기를 알 수 있으며 Bash는 ulimit에 내장되어 있습니다.

좀 더 흥미로운 질문은 결과 문자열에 얼마나 많은 메모리가 있는지 그리고 할당을 수행해야하는지 여부입니다.

+0

왜 단일 스레드를 언급 했습니까? 동일한 스택 아규먼트는 멀티 쓰레 디드를 위해 유지됩니다. –

+0

아닙니다. 멀티 스레드 프로그램에서 각 스레드는 고유 한 스택을 가지고 있으며 일반적으로 스택의 한계가 아닌 프로세스의 정상 메모리 한계에서 할당됩니다. –

+0

그래, 모든 스레드가 자체 스택을 가지고 있으므로 분석이 좀 더 복잡해집니다. –

0

구현 및 설정 (OS, 설정 등)에 따라 다릅니다. 일반적으로 로컬 변수와 인수는 스택에 저장되며 스택의 크기는 플랫폼, 개인 설정 등에 따라 다릅니다.

일반적으로 큰 값을 스택에 저장하는 것은 좋지 않습니다. 함수가 다른 함수를 호출하는 경우 스택 공간 등이 필요합니다.

모든 구현이 스택을 사용하지 않을 수도 있고 매우 적을 수도 있습니다.

로컬 프레임에 너무 큰 값을 저장하지 마십시오.

0

printf는 아무 것도 저장하지 않아도됩니다. 그리고이 방법으로 구현할 수 있습니다. 인수를 가져 와서 서식으로 출력하십시오.

관련 문제