2014-07-13 2 views
1

여기에 내가 포인터를 사용하여 구조에서 문자열을 출력하기 위해 쓴 코드입니다 : 내가 함수의 변수 페이지를 선언하지 않은 말을 지금포인터는 문자열을 반환하지 않는 구조

#include <stdio.h> 
#include <stdlib.h> 
struct xenon 
{ 
    int size1; 
    int marks[10]; 
    char *w; 
    struct xenon *p; 
} x1,x2; 

main() 
{ 
    x1.size1=10; 
    x2.size1=6; 
    printf("%d\n",x1.size1); 
    printf("%d\n",x2.size1); 
    (*p).w="my word"; 

    printf("%s\n",(*p).w); 
    printf("%s\n",x1.w); 
} 

내가 오류가가 본관. 그러나 그것은 내가 선언 할 때도 마찬가지이다.

x1.w="my word"; 
printf("%s",x1.w); 

나는 구조체 바로 바깥에서 포인터 변수를 선언하려고 시도했지만 여전히 컴파일되지 않았다. 구조체에 대한 포인터를 선언하는 방법에 문제가 있습니까? 아니면 완전히 다른 것입니까?

+0

음, x1과 x2를 정의했습니다. 따라서 x1.p와 x2.p가 있지만 코드에서 초기화되지 않았습니다. 예 : x1.p = &x2; – Steger

+0

'x1'과'x2'는 전역 변수이므로 존재합니다. – AntonH

답변

3

p가 범위의 변수가 아닌 구조의 구성원이기 때문에 컴파일 타임 오류가 발생합니다. 형제 자매를 언급 한 것처럼 그렇게 참조하십시오.

(*x1.p).w="my word"; 

printf("%s\n",(*x1.p).w); 

일단 수정하면 Steger가 위의 주석에서 언급 한 런타임 오류가 발생합니다. x1.p를 & x2로 지정할 수 있습니다. 그러나 연결된 목록을 만들려고한다면 x1.p에 동적으로 할당 된 구조를 할당하는 것이 더 일반적 일 것입니다.

+0

역 참조하기 전에'x1.p' 포인트를 유효한 메모리로 만들어야합니다. –

+0

예, 위의 두 번째 단락에 언급되어 있습니다. –

+0

설명해 주셔서 감사합니다 :) –

0
(*p).w="my word"; 

p는 구조체의 멤버입니다. 해당 구조에 대한 포인터 변수를 선언하지 않았습니다. 아래와 같이 struct 변수를 선언해야합니다. 직접 사용할 수 있도록 x1x2은 여기 메모리

struct xenon 
{ 
    int size1; 
    int marks[10]; 
    char *w; 
} x1,x2 *p; 

은 이미 할당됩니다. 그러나 p을 사용하기 전에 메모리를 할당해야하거나 다른 struct 변수의 주소를 할당해야합니다.

p = malloc(sizeof(struct xenon); 

또는

p = &x1; 

직접 p->w="my word"에 의해 문자열 리터럴을 할당 할 수 있습니다 그렇지 않으면 당신이 메모리를 할당하고 아래와 같이 문자열을 복사 할 수 있습니다.

p->w = malloc(strlen("my word") + 1); 
strcpy(p->w, "my word") 
+0

당신의 요점을 이해 했습니다만, 그 문자열을 char * w에 어떻게 할당할까요? ...에서와 같이 특정 코드를 줄 수 있습니까? –

+0

내 대답이 업데이트되었습니다. 확인해주십시오. –