2014-11-03 3 views
1

구조체에 대한 포인터 배열을 보유하고있는 C 프로그램에서 작업하고 있습니다. 먼저 구조체는 다음과 같습니다구조체의 포인터 배열에 포인터를 반환

다음
typedef struct 
{ 
    int ID; 
    char Name [20]; 
} rec; 

내가 가진이 구조체의 1 생성 기능 : 이제이 기능이 잘 작동

struct rec* addEntry(){ 
    rec *temp; 
    temp = malloc(sizeof(rec)); 
    printf("Please give me an ID number\n"); 
    scanf("%d", &temp->ID); 

    printf("Now give me a name, maximum size for this is 20 characters\n"); 
    scanf("%s", &temp->Name); 
    return temp; 
} 

, 그것은 구조체를 생성하고 그쪽으로 포인터를 반환

struct rec* returnPointerToPointerArray() 
{ 
    rec *pointerArray[2]; 
    pointerArray[0] = addEntry(); 
    pointerArray[1] = addEntry(); 
    printf("ID in main : %d\n", pointerArray[0]->ID); 
    printf("Name in main : %s\n", pointerArray[0]->Name); 
    printf("ID in main : %d\n", pointerArray[1]->ID); 
    printf("Name in main : %s\n", pointerArray[1]->Name); 
    pointerArray = malloc(sizeof(rec*)*2); 
    return pointerArray; 
} 

: 구조체 I는 포인터 배열을 생성하고, 구조체 포인터 향해 그것을 채우고 다른 기능을 가질 무슨 일이 일어나는지 확인하기 위해 포인터 배열에있는 위치에 저장된 값을 출력합니다. 이 시점에서 포인터 배열의 값이 정확합니다.

하지만이 포인터 배열에 대한 포인터를 malloc 방으로 반환해야합니다.

malloc 함수 라인은 나에게 오류 제공 : 내가 링크 된 목록을 사용할 수 없습니다 명확히하려면 지금

error: incompatible types when assigning to type 'struct rec *[(sizetype)(size)]' from type 'void *' 

을, 내가 대신 포인터의 배열을 사용해야합니다. 는 다음과 같은 코드에서 나는 또 다른 오류가 내 메인 루프에 추가하려면 :

rec *pointerArray[2]; 
pointerArray = returnPointerToPointerArray(2); 
printf("ID in main : %d\n", pointerArray[0]->ID); 
printf("Name in main : %s\n", pointerArray[0]->Name); 

이 나에게 다음과 같은 오류를 제공합니다 :

error: incompatible types when assigning to type 'struct rec *[2]' from type 'struct rec *' 

어떤 도움을 환영합니다 후 더 많은 것이다. 사전에

감사합니다, Ylva

여기
+0

'pointerArray는 = malloc에을 (를 sizeof (REC *) * 2);' 너는 이미 그 안에 물건을 저장하려고 시도한 이래로 의도 한대로 작동하지 않을 것이고 어쨌든 너무 늦었다. 'pointerArray'는 포인터가 아닌 자동 스토리지 배열이므로 malloc 할 수 없습니다. –

+0

하지만 그 배열에 대한 포인터를 반환한다면 배열은 로컬로 선언되었으므로 사라지지 않을 것입니까? – Ylva

+0

구조체 포인터를 사용하기 전에 포인터를 아무 곳이나 가리 키도록 초기화하지 않고 두 함수에서 struct에 대한 포인터를 만들었습니다. 아래 예제를 작성했습니다 (처음 작성시 오류가 있었으며 현재 테스트를 마쳤습니다). – ryyker

답변

1

이 코드는하지 않습니다 의미 :

struct rec* returnPointerToPointerArray() 
{ 
    rec *pointerArray[2]; 
    pointerArray[0] = addEntry(); 
    pointerArray[1] = addEntry(); 
    ... 
    pointerArray = malloc(sizeof(rec*)*2); 
    return pointerArray; 
} 

두 포인터의 힙 기반 배열을 할당하려고 이후 포인터의 스택 배열을 정의하고 그들에게 struct rec 개체에 대한 힙 주소를 할당하고있어 스택 하나의 주소로. 결코 컴파일되지 않습니다.

함수는 rec 유형의 객체 (이 둘은 배열의 두 구조 중 첫 번째 임)에 대한 포인터를 반환하도록 설계되었으므로 먼저 힙에 두 포인터의 공간을 할당해야합니다. 따라서 이중 포인터를 사용) 한 후 채 웁니다/반환 : 작업이 완료되면

struct rec** returnPointerToPointerArray() 
{ 
    rec **pointerArray; 
    pointerArray = malloc(sizeof(rec*)*2); // Allocates 2 pointers 
    pointerArray[0] = addEntry(); 
    pointerArray[1] = addEntry(); 
    ... 
    return pointerArray; 
} 

Live Example

당신은 또한 할당 된 메모리를 해제해야한다.

+2

마침내 더 좋아 보입니다. –

+0

감사합니다. 여기에 이중 포인터를 써야한다는 것을 몰랐습니다. – Ylva

+0

'struct rec'와'rec'는 서로 다른 타입이고, 당신은 오직 ** 하나 **의 엔트리에 대한 포인터만을 반환합니다. –

0

두 가지 문제는 내가 확인 : 당신이 pointerArray에 결과를 복사하기 전에 반환

첫째.

pointerArray = malloc(sizeof(rec*)*2); 
return pointerArray; 

내 제안은 내가 변수 이름을 변경 한

struct rec** returnPointerToPointerArray() 
{ 
    rec *pointerArray[2]; 
    pointerArray[0] = addEntry(); 
    pointerArray[1] = addEntry(); 
    printf("ID in main : %d\n", pointerArray[0]->ID); 
    printf("Name in main : %s\n", pointerArray[0]->Name); 
    printf("ID in main : %d\n", pointerArray[1]->ID); 
    printf("Name in main : %s\n", pointerArray[1]->Name); 
    rec **pointerArray2 = malloc(sizeof pointerArray); 
    pointerArray2[0] = pointerArray[0]; 
    pointerArray2[1] = pointerArray[1]; 
    return pointerArray2; 
} 

통지입니다. 코드에서 다른 실수를 저 지르 셨습니다.

둘째

rec *pointerArray[2]; 

포인터 배열이다. 를 선언하는 방법은 간단하다 :이 라인은 사용 및 선언이 일치해야

pointerArray = returnPointerToPointerArray(2); 

BTW

rec **pointerArray; 

.

업데이트 :

내 대답에 약간의 오류가 발생했습니다. 당신은 포인터의 배열을 반환하고 있습니다.

+0

는 rec * pointerArray; 형식 rec에 대한 포인터를 만들지 않고? 그리고 형식을 rec에 대한 포인터의 배열이되지 않을까요? – Ylva

+0

@Ylva는 당신이 걱정하는 것을 이해하지 못합니다. 포인터와 배열은 타이핑 시스템에서 동일합니다. 'rec * pointerArray;'는 어떤 주소를 가리키는 포인터입니다. 'pointerArray [1]'에 의해 그것을 배열로 역 참조하기. – HuStmpHrrr

+0

pointerArray = returnPointerToPointerArray (2); 실제로 작동하지 않습니다,되어야합니다 pointerArray = returnPointerToPointerArray(); – Ylva

0
typedef struct 
{ 
    int ID; 
    char Name [20]; 
} rec; 

struct rec* returnPointerToPointerArray() 
{ 
    rec *pointerArray[2]; 
    pointerArray[0] = addEntry(); 
    pointerArray[1] = addEntry(); 
    ... 
    return pointerArray; 
} 

두 가지 이유로 반환 유형이 잘못되었습니다. 이 함수는 rec *을 반환하고 정의되지 않은 struct rec *에 대한 포인터를 반환하도록 선언됩니다. 유형 struct rec은 typedef rec과 동일하지 않습니다!

두 번째로 포인터에서 rec으로 포인터 을 반환해야합니다. 배열을 반환하면 배열 이름이 포인터 인 첫 번째 요소에 대한 포인터로 변환됩니다.

또한 pointerArray을 실제 배열로 선언했습니다. 배열에 새 값을 할당 할 수없고 로컬 변수에 대한 포인터를 반환 할 수 없습니다. pointerArray의 수명은 실행이이 함수를 벗어날 때 끝나기 때문에이 함수에 대한 포인터는 완전히 쓸모가 없습니다. 이러한 포인터를 사용하면 정의되지 않은 동작이 발생합니다.

먼저 배열 동적 메모리를 할당 에, 배열을 채울 한 다음 반환해야합니다 : 여기

rec** returnPointerToPointerArray() 
{ 
    rec **pA = malloc (2 * sizeof *pA); 
    if (pA) { 
    pA[0] = addEntry(); 
    pA[1] = addEntry(); 
    if (pA[0]) { 
     printf("ID in main : %d\n", pA[0]->ID); 
     printf("Name in main : %s\n", pA[0]->Name); 
    } 
    if (pA[1]) { 
     printf("ID in main : %d\n", pA[1]->ID); 
     printf("Name in main : %s\n", pA[1]->Name); 
    } 
    } 
    return pA; 
} 

같은 문제 :

rec *pointerArray[2]; 
pointerArray = returnPointerToPointerArray(2); 
printf("ID in main : %d\n", pointerArray[0]->ID); 
printf("Name in main : %s\n", pointerArray[0]->Name); 

당신은 새를 할당 할 수 없습니다를 값을 배열에 반환합니다. 포인터가을 포인터로서 당신은 pointerArray를 정의해야

rec **pointerArray; 
pointerArray = returnPointerToPointerArray(/*2*/); 
관련 문제