2010-03-24 13 views
0

나는 sample1과 sample2의 차이점을 알고 싶다. 왜 때때로 구조체를 인수로 전달해야하며 때로는 함수에서 전달하지 않고 할 수 있습니까? samplex 함수가 여러 구조체를 사용해야한다면 어떻게 될까요? 인수로 여러 구조체를 전달 하시겠습니까? 모든C 구조체를 인수로 사용

struct x 
{ 
    int a; 
    int b; 
    char *c; 
}; 

void sample1(struct x **z;){ 
    printf(" first member is %d \n", z[0]->a); 
} 

void sample2(){ 
    struct x **z; 
    printf(" first member is %d \n", z[0]->a); // seg fault 
} 

int main(void) 
{ 
    struct x **z; 

    sample1(z); 
    sample2(); 

    return 0; 
} 
+0

우수함!정보 주셔서 감사합니다! 나는 그걸로 조금 혼란스러워했다! – Brian

답변

1

첫째, 당신의 인수 유형은 구조체 아니라, 포인터 구조체의 포인터 (또는 구조체에 대한 포인터의 배열 - 이들의 주소를 제외하고,보기의 수신자의 관점에서 의미 적으로 동일 배열은 변경할 수 없습니다).

두 번째 경우에는 main에 같은 이름의 로컬 변수와 완전히 독립적 인 로컬 변수를 사용합니다. 초기화되지 않았기 때문에 구성원 중 하나에 액세스하려고하면 seg 오류가 발생합니다. (main에있는 하나도 초기화되지 않았지만 액세스하는 것은 우연히 sample1에서 작동하는 것 같습니다.

변수를 사용하기 전에 변수를 초기화해야합니다. 그렇지 않으면 정의되지 않은 동작의 영역을 입력해야합니다. 예 :

void sample1(struct x **z){ 
    printf(" first member is %d \n", z[0]->a); 
} 

void sample2(){ 
    struct x z[1]; 
    z[0].a = 1; 
    ... 
    printf(" first member is %d \n", z[0].a); 
} 

int main(void) 
{ 
    struct x z[1]; 

    z[0].a = 1; 
    ... 
    sample1(z); 
    sample2(); 

    return 0; 
} 
0

둘 다 유효하지 않으며 잘못된 메모리에 액세스 중입니다. 결과는 모두 정의되지 않으므로 두 결과가 모두 정확합니다.

0

C 및 C 유사 언어는 "범위"개념을 가지고 있습니다. 모든 중괄호 ({})를 참조 하시겠습니까? 그것들은 "블록"입니다. 그들은 본질적으로 그것들 사이의 모든 코드를 동일한 레벨의 다른 블록과 독립적 인 묶음으로 포장합니다. 해당 블록에서 작성한 변수는 해당 블록 내에서만 액세스 할 수 있습니다. 다른 곳에서는 참조 할 수 없습니다.

중첩 된 블록을 만들 수 있습니다. 예를 들어 당신이 볼 수 있듯이

int f() { 
    int x; 
    scanf("%d", &x); 
    if (x == 3) { 
     return 7; 
    } 
    else { 
     return x; 
    } 
} 

else 블록은 함수의 블록 안에 중첩되고, 따라서 함수의 변수에 액세스 할 수 있습니다.

mainsample2 모두에 struct x **z을 선언하면 실제로 두 개의 변수 (모두 z)가 생성됩니다. 이들은 완전히 독립적입니다. 그들은 같은 변수가 아닙니다. 그들은 관련이 없습니다. 공통점은 이름과 유형뿐입니다. 실제 값은 다릅니다. 두 변수 모두에서 동일한 변수를 사용할 수있는 유일한 방법은 sample1에서와 같이 전달하는 것입니다.

물론 현재 z 포인터는 쓰레기입니다. 아무 것도 할당하지 않았습니다. 실제로 시도하기 전에 거기에 뭔가를 저장하는 것이 좋습니다.

0

귀하의 선언은

struct x **z; 

단순히 X 형의 구조에 대한 포인터에 대한 포인터를 만듭니다. 실제로 포인터를 초기화하지 않습니다. 즉 포인터를 아무 곳이나 가리키고 있습니다.

(나는 당신이 실제로 불구하고, 달성하려고하는지 전혀 모르겠어요!)

struct x z; 
struct x *pZ = &z; 

sample1(&pZ); 

뭔가를 시도

관련 문제