2016-07-08 2 views
-2

나는 C의 기초에 의문을 품는다.누군가이 코드를 명확하게 설명해 주시겠습니까?

  • 다음 코드를 작성했습니다. 여기에 add() 함수에서, 나는 아무것도 돌려주지 않을 것이므로 출력이 약간의 정크 값이나 뭔가가 될 것이라고 예상했지만 그렇게되지는 않았습니다. 왜 그런 일이 일어 났는지 설명 할 수 있습니까? 코드에 잘못된 내용을 적어두면 실례합니다.
  • 내 생각에 변수 add1에 대한 메모리가 스택에서 나온 것이므로 add()이 완료되면 할당 된 모든 메모리가 해제되므로 일부 정크 값이 표시됩니다.
  • 명백한 의심은 아무 것도 반환하지 않고 어떻게 올바른 값을 인쇄 할 수 있습니까?

코드 샘플 :

main() { 
    int x = 4, sum; 
    int n; 

    printf(" enter a number \n"); 
    scanf("%d", &n); 

    sum = add(x, n); 

    printf(" total sum = %d\n", sum); 
} 


add(int x, int n) { 
    int add1 = 0; 

    add1 = x + n; 

    //return(add1); 
} 
+5

이것은 정의되지 않은 동작입니다. 실제로 일어나고있는 일을 정확하게 이해하려고 시도하는 것은 실제로 생산적이지 않습니다. 당신이보고있는 어떤 행동도 예측할 수 없습니다. OS, 컴파일러, 프로그램 내 다른 (심지어 무관 한) 코드에 따라 달라질 수 있습니다. – kaylum

+2

어떤 컴파일러가 사용됩니까? gcc가이 코드를 컴파일하지 못했습니다. 오류 : ISO C++에서 유형이없는 'add'선언을 금지합니다. [-fpermissive] – Evgeniy

+5

@Evgeniy : 다른 언어가 무엇인지 명시하는 것은 쓸모가 없습니다. C가 아닌 C++은 C가 아닙니다. – Olaf

답변

0

이 정의되지 않은 동작입니다.

함수가 반환하는 것을 지정하지 않으면 기본적으로 int가됩니다. 그런 다음 return 문이 없으면 어떤 결과가 발생할지 정의되지 않습니다. 그래서 원칙적으로 어떤 일이 일어날 수 있습니다.

gcc의 경우 많은 시스템에서 "임의"값을 반환합니다. 귀하의 경우에는 단지 합계가 발생합니다. 단순히 "행운"에 의해.

컴파일하는 동안 항상 경고를 켭니다. gcc -Wall 경고가 항상 오류 인 것처럼 처리합니다. 앞서 언급 한 바와 같이이 정의되지 않은 동작입니다,

#include <stdio.h> 

int add(int x,int n);  // Corrected 

int main(void) // Corrected 
{ 
    int x=4,sum; 

    int n; 

    printf(" enter a number \n"); 
    scanf("%d",&n); 

    sum = add(x,n); 

    printf(" total sum = %d\n",sum); 

    return 0;  // Corrected 
} 


int add(int x,int n)  // Corrected 
{ 

    int add1=0; 

    add1 = x+n; 

    return add1;  // Removed the // to uncomment and removed unnecessary() 
} 
+2

** ** 정의되지 않은 ** 비헤이비어가 작동하는 방식을 정의하려고합니다. "임의의 값"이 반환되거나 비강 데몬이 나타나는 경우에는 순수한 추측입니다. 표준 준수 컴파일러 **에 ** 경고해야하는 다른 문제도 있습니다. – Olaf

+0

예 형제, 우물 편집 코드가 잘 작동합니다. 알겠습니다.하지만 내 질문에 답장을하지 않아도 무작위로 반환됩니다. 이상적으로, 스택이 add1 권한을 위해 메모리를 해제 할 것이므로 값을 잃어버린다는 것은 아무 것도 반환하지 말아야한다. 혼란스러워. upls 그것을 조금 더 명확하게 설명 할 수 있습니까? –

+1

@ t.purnaChander - 대부분의 시스템에서이 간단한 함수는 CPU 레지스터 중 하나에 값을 넣어 값을 반환합니다. 이는 시스템에 고유하며 ABI에 문서화되어 있습니다. 'main'에있는 코드는 그 레지스터를 읽고 리턴 값으로 취급 할 것입니다. 함수가 실제로 레지스터에 썼는지 여부는 중요하지 않습니다. – 4386427

0

, 당신은 그것에 의존해서는 안 :

코드는 같은 것을 보일 것입니다.

그러나 무슨 일이 일어나고 있는지에 대한 논리가 있습니다. 함수의 반환 값은 일반적으로 x86의 eax 레지스터에 저장되거나 x86_64의 rax 레지스터에 저장됩니다. 컴파일러가 계산 된 값을 저장하기 위해 eax 또는 rax 레지스터를 사용하고 있습니다. 또한 리턴 유형 add()이 지정되지 않으므로 암시 적으로 int으로 정의됩니다.

관련 문제