2011-09-06 3 views
2

초급 C 여기. 여기가 합법적인가? 나는이 코드를 실행하면 상태 액세스 위반이 점점 계속 :구조체 및 C 루핑에 대한 도움말

struct point { 
    char *x; 
    char *y; 
} 

int main() 
{ 
    .... 
    struct point *pt; 

    for (;;) 
    { 
     ....   
     pt = process_message(message); 
     printf("%s",pt->x); 
     ... 
    } 
} 

struct point* process_message(char* message) 
{ 
    struct point *pt; 
    pt = malloc(1*sizeof(struct point)) 
    strncpy(pt->x, message, 4); 
    return pt; 
} 

EDIT 내가 몇 가지 변경을

안녕 얘들 아 ...하지만 여전히 액세스 위반을 받고. 조언 부탁드립니다!

+0

'process_message' 코드를 보여줍니다. 지금 그대로 서서 초기화되지 않은 포인터를 사용 중입니다 ... – delnan

+0

오류가 어디에 있는지 알기 위해 더 많은 코드가 필요합니다. – wormsparty

+1

'process_message'는'struct price'에 대한 포인터를 반환하지만 변수'pt'는'struct point'에 대한 포인터입니다. 그런 유형을 섞지 마십시오. – pmg

답변

11

struct point의 메모리를 process_message에 할당해야합니다. 이 같은

뭔가 :

struct point* process_message(char* message) 
{ 
    struct point *pt; 
    pt = malloc(1*sizeof(struct point)); 
    // ... do some processing ... 
    return pt; 
} 

는 물론, 당신이 나중에 어떤 점에서 포인터를 free한다.

또한 struct pointprocess_message으로 보내거나 유형 일치를 확인해야합니다.주의 깊게 보면 struct price*을 돌려 주지만 (전화면에서) struct point *이 나올 것으로 예상됩니다.

UPDATE : 이제 질문은 업데이트 된

, 당신은 또한 당신이이 작업을 수행 할 수 char *y 경우 char *x 메모리를 할당해야합니다

strncpy(pt->x, message, 4); 

내가 읽는 것이 좋습니다 C++에서 메모리 관리와 포인터에 관한 약간 (또는 많은). 포인터가 데이터를 처리하는 유일한 방법은 C 프로그래밍 언어입니다.

(CODE 편의를 위해 DONE 오류 검사)

+2

그리고 그것을 해방하십시오! – James

+0

'pt-> x' 또한 포인터이며, 포인터가 뭔가를 가리킬 필요가 있다는 것을 의미합니다. –

+0

@ 스티브 : 예, OP가 질문에이를 추가했습니다. –

2

는 기능도 process_message

pt = malloc (sizeof (struct point)); 
/* do processing */ 
return pt; 

당신이 pt 작업을 완료 한 후 free (pt) 무료로 기억에 메모리를 할당하는 것을 잊지 않는다.

편집

은 또한 당신은 pt의 할당 한 후, 기능에 xy에 문자열을 저장하기 위해 메모리 블록을 할당해야합니다. 작업을 마쳤 으면 먼저 문자열 (메모리 블록)을 해제 한 다음 구조를 해제해야합니다.

+0

'sizeof * pt'를 사용하는 것을 선호합니다. 'pt'가'struct price'에 대한 포인터가 될 때 malloc 줄을 변경할 필요가 없습니다 :-) – pmg

5

귀하의 main 기능은 정상입니다. 귀하의 문제는 process_message입니다. 포인터는 구조체에 포인터를 사용하고 있지만 메모리를 할당하지 않고 액세스 한 다음 반환합니다. 포인터를 단독으로 선언해도 구조체를 보유 할 메모리는 생성되지 않습니다. 따라서 구조체의 메모리를 할당 (예 : malloc 사용)하여 함수가 끝난 후 메모리가 "존재"하도록해야합니다. 그런 다음 포인터를 반환 할 수 있으며 완료하면 free을 메인에 넣습니다.

간단한 조작으로 인해 목표를 달성하는 데 더 좋은 방법이있을 수 있습니다. ALLOC를/무료 필요

struct point pt; 
process_message(message, &pt); 
printf("%s", pt.x); 

이 "재사용"할 로컬 메모리가 아닌 : 하나는 main 기능의 지역 중 하나 "처음"구조체를 유지하고, 메시지를 처리하기 위해 해당 주소를 전달하는 것입니다. 여기서 아무것도 반환하지 않는다는 것을주의하십시오. 프로세스 함수에서 구조체를 "채울"뿐입니다.

struct point process_message(char* message) 
{ 
    struct point pt; 
    ... do some processing ... 
    return pt; 
} 

을 그리고 다음과 같이 호출 : 당신이 C의 현대 버전을 사용하는 경우

마지막으로, 당신은 실제로 당신이 원하는 경우 함수에서 전체 구조를 반환 할 수 있습니다

struct point pt = process_message(message); 
+0

(+1) 나는 당신의 대답을 더 좋아합니다. 많은 시간, 여러 번 호출되면'process_message' 내부에서'malloc' 호출로 인해 성능이 떨어질 것이라고 생각합니다. –

+0

구조를 반환하는 문제를 해결하려면 C의 진정한 골동품 버전을 사용해야합니다. 그것은 C89 표준이 발표되기 전에 수년 동안 허용되었습니다 (K & R 1st Edn이 출판 된 이후에도 허용되지 않았 음). –

0

포인터를 만들 때마다 sizeof (ptr) 메모리 일 뿐이므로 일부 데이터를 가리 킵니다. 따라서 데이터가 저장되는 메모리가 있어야합니다. 그래서 함수 (process_message) 나 함수를 호출 할 때 메모리를 할당하십시오. 지금, 당신은 구조체 포인트를 할당하고 서면으로이

struct point *pt = (struct point*)malloc(sizeof(struct point)); 
+1

'sizeof * pt' (malloc의 반환 값을 캐스팅 할 필요 없음)를 사용하는 것을 선호합니다.'pt'가'struct price'에 대한 포인터가 될 때 malloc 줄을 변경할 필요가 없습니다 :-) – pmg

0

같이 가야하지만, 그 구조는 문자열 자체에 대한 스토리지를 문자열로 포인터를 포함하고 있지. 당신이 그들에 복사하기 전에 문자열 공간을 할당해야합니다

pt = malloc(1*sizeof(struct point)); 
pt->x = (char *)malloc(strlen(message) + 1); 
별도로 할당 된 저장 공간을 무료로 사용하고, 잊지 마세요 전에

이> PT-에 대한 Y를 동일한 작업을 수행하는 것을 잊지 마세요 문자열에 대해, 그리고 struct에 할당 된 값을 반환합니다.