2016-11-04 4 views
0

C (포인터, 포인터 포인터 등)로 첫 걸음을 내디뎠습니다. 너무 바보 같은 질문이라면 자비를 베풀어주십시오.C - snprintf 이후에 출력되지 않습니다.

이 조각 출력 아무것도 :

char buf[256]; 
snprintf(buf, sizeof buf, "output: %s%s%s"); 

puts("test"); 

그리고 (예상대로)이 조각 출력 "테스트"

char buf[256]; 
snprintf(buf, sizeof buf, "output: %s%s"); 

puts("test"); 

=>test 

질문 : 여기에 재생 현재 snprintf 않는 역할? puts-statement와 어떤 관계가 있습니까? 아니면 첫 번째 코드에 효과/출력을 넣지 않은 이유는 무엇입니까? snprintf(buf, sizeof buf, "output: %s%s%s");은 3 개 개의 매개 변수를 필요로

+2

'snprintf' 호출에 매개 변수가 없습니다. 컴파일러가 경고합니다 (컴파일러 경고가 활성화되었다고 가정). [다음 중 하나] (http://stackoverflow.com/q/562303/253056)를 선택하고 약간의 독서를 원할 수 있습니다. –

+1

또한 sprintf 및 snprintf는 stdout에 아무 것도 인쇄하지 않고 버퍼 (사용자의 경우 buf)에 인쇄합니다. – Marco

+0

eclipse cdt를 사용하고 있습니다. 컴파일러 경고가 나타나지 않습니다. 어딘가에서 설정을 놓친 경우 지금 바로 확인하십시오 –

답변

1

때문에 : 당신은 늘 현재 snprintf를 의미하지 않는다 기능을 현재 snprintf하는 매개 변수를 전달하지 않는 경우

snprintf(buf, sizeof buf, "output: %s%s", str1, str2);

:

snprintf(buf, sizeof buf, "output: %s%s%s", str1, str2, str3);

snprintf(buf, sizeof buf, "output: %s%s");는이 매개 변수가 필요합니다 그들을 액세스하려고합니다. 따라서, snprintf가 존재하지 않는 "str3"매개 변수에 액세스하려고 시도 할 때 발생하는 분할 오류 결과가 표시됩니다.

+0

감사합니다. 귀하의 답변이 그럴듯 해 보입니다. 그러나 두 가지 테스트 (성공 및 실패)에서 적어도 두 가지 매개 변수가 누락되었습니다. 그 중 하나에서 세그멘테이션 오류가 발생하지 않습니다. 이것은 컴파일러의 예측 가능한 동작이 아니거나? 어쨌든 기능을 사용하지 않을 때 이러한 질문에 대한 합리적인 대답이 있다고 생각하지 않기 때문에 답변을 수락합니다. –

+2

예기치 않은 동작은 이러한 오류로 인해 예상되는 동작입니다. 이를 정의되지 않은 동작이라고합니다. – chqrlie

+0

snprintf가 처음 두 매개 변수에 액세스하려고하면 해당 매개 변수가 기존 페이지에 있습니다 (snprintf는 일부 정크를 받지만 프로세스에 속한 메모리에서 가져옵니다). 그러나 세 번째 매개 변수 snprintf tryes에 액세스하려고하면 메모리에 액세스하려고 시도합니다 페이지가 귀하의 프로세스에 속하지 않거나 존재하지 않아 세그먼트 오류가 발생합니다. 세그먼트 화 오류가 발생할 때 다른 단어는 할당 된 메모리 페이지의 스팸 정보에 달려 있습니다 (snprintf가/0 = EOL을 검색하기 때문에). – nopasara