2017-04-05 8 views
0

안녕하세요 저는이 구조체의 새 인스턴스를 만들고이구조체의 인스턴스를 생성 배열을 만들기

같은 임의의 값을 갖는 속성을 초기화하는 함수를 만들어

struct Test 
{ 
    unsigned char* c_string; 
    unsigned int value; 
}; 

다음과 같은 구조체를 얻었다

struct Test* createNewTest(){ 
struct Test *NewInstance = (Test *)malloc(sizeof(Test)); 
NewInstance->value = rand(); 

이제 구조체의 초기화 된 인스턴스를 완전히 생성하는 함수를 만들어야합니다.

struct Test** createNewArray(unsigned int n){ 
}; 

누구든지 도와 줄 수 있습니까? 내가

먼저 ... 그대로 과제로 당신에게 대답을주지 않고이 문제를 설명하려고거야 정말 지금 여기

+0

스택 오버플로에 오신 것을 환영합니다! ['malloc()'과'C'의 패밀리의 반환 값을 왜 던지지 말아야하는지에 대한이 토론을보십시오.] (http://stackoverflow.com/q/605845/2173917). –

+2

'sizeof (Test)'->'sizeof (struct Test) ' –

+0

임의의 숫자에 포인터 c_string을 할당하여 달성하려는 것이 확실하지 않다고 생각하지 않습니다. sizeof (Test)를 사용하려면 구조체 앞에 typedef를 접두사로 추가하고 구조체에 이름을 추가하십시오. – SPlatten

답변

0

시작하는 방법을 해달라고, 당신은 n 배의 메모리를 할당해야합니다. malloc은 금액을 할당 할 수 있으므로 번호를 계산하면됩니다.

둘째, 배열의 각 항목에 대해 동일한 초기화를 수행해야합니다. 이를 위해서는 루프가 필요할 것입니다.

힌트 : C에서는 단일 인스턴스에 대한 포인터와 동적 배열에 대한 포인터를 구별 할 수 없습니다. ptr->valueptr[0].value과 동일하고 ptr[1].value은 배열의 다음 요소입니다.

0

최소 예 :

#include <stdlib.h> 

#define RANDOM 'a' 

struct box { char content; }; 



// Array of n initialized `box`es 

struct box* new_array(int count) { 
    struct box* arr_ptr = malloc(sizeof (struct box) * count); 

    struct box* ptr = arr_ptr; 
    while (count --) { 
     ptr++ -> content = RANDOM; 
    } 

    return arr_ptr; 
} 



// Array of n pointers to initialized `box`es 

struct box* new_box(void) { 
    struct box* box_ptr = malloc(sizeof (struct box)); 
    box_ptr -> content = RANDOM; 
    return box_ptr; 
} 

struct box** new_ptr_arr(int count) { 
    struct box** arr_ptr = malloc(sizeof (struct box*) * count); 

    struct box** temp = arr_ptr; 
    while (count --) { 
     * temp++ = new_box(); 
    } 

    return arr_ptr; 
} 
+1

[malloc() 및 C의 패밀리 반환 값을 캐스팅하지 않는 이유에 대한 질문] (/ q/605845)을 읽고 이해하십시오. –

+0

@ toby-speight http://stackoverflow.com/a/1565552/7090469 – suchtgott

1

그것은 매우 간단합니다. 당신이 가지고있는 기능을 사용하여,

struct Test **array = malloc(n * sizeof *array); 
if (!array) return array; 

을 그리고 각 포인터를 할당합니다 : 먼저, struct Testn 포인터에 대한 충분한 저장 공간을 할당해야합니다

for (size_t i = 0; i < n; ++i) 
    array[i] = createNewTest(); 

이 모든 걸 포장을, 당신은

를 얻을 수
struct Test **createNewArray(size_t n) 
{ 
    struct Test **array = malloc(n * sizeof *array); 
    if (!array) return array; 

    for (size_t i = 0; i < n; ++i) 
     array[i] = createNewTest(); 

    return array; 
} 

일치하는 free() 함수를 반드시 작성해야합니다.

Test에 대한 포인터의 배열을 실제로 원하는지 고려하십시오. Test 개체의 배열을 사용하는 것이 더 나을 것입니다.