2017-03-15 2 views
-1

정수와 문자열의 두 필드가있는 구조체 프로그램을 작성해야합니다. 다음으로이 구조체를 동적으로 할당하는 함수를 작성해야하며 int 및 string을 매개 변수로 사용하여 할당 된 구조체로 전달합니다. 이 함수는 또한 새로 만들어진 구조체에 대한 포인터를 반환합니다. 이 프로그램의 두 번째 요소는 struct 포인터를 매개 변수로 취하고 모든 fileds를 화면에 출력 한 다음 struct의 메모리를 해제하는 함수 여야합니다. 이것이 내가 생각할 수있는 최선의 방법입니다.구조체의 동적 메모리 할당

#include <stdio.h> 
#include <stdlib.h> 

struct str{ 
    int num; 
    char text[20]; 
}; 

struct str* return_address(int *num, char *text){ 
    struct str* new_struct=malloc(sizeof(struct str)); 
    new_struct->num=num; 
    new_struct->text[20]=text; 
    return new_struct; 
}; 

void release(struct str* s_pointer){ 
    printf("%d %s", s_pointer->num, s_pointer->text); 
    free(s_pointer); 
}; 



int main() 
{ 
    struct str* variable=return_address(1234, "sample text"); 
    release(variable); 

    return 0; 
} 
+0

문제는 무엇인가? – sergej

+0

나는이 프로그램을 작동시킬 수 없었다. 컴파일 되더라도 충돌이 발생합니다. –

+0

'new_struct-> text [20] = text;'는 당신이 원하는 것이 아닙니다. –

답변

0
  1. 배열도 전혀하지 동적이다, 매우 작습니다. 어쨌든 malloc()을 사용하여 할당하는 경우 모든 것을 동적으로 할당하지 않으시겠습니까?
  2. 배열에 할당 할 수 없습니다.
  3. "문자열"의 길이를 저장한다고 가정 된 num 구성원에 포인터가 할당되어 있는데, 이는 분명히 원하는 것이 아닙니다. 또한 포인터에 정수를 할당 할 때 아주 특별한 상황에서만 동작이 정의되므로 경고를 해제하지 않는 한 컴파일러에서 경고해야합니다. 아마도 당신이 원하는

,

struct string { 
    char *data; 
    int length; 
}; 

struct string * 
allocate_string(int length, const char *const source) 
{ 
    struct string *string; 
    string = malloc(sizeof *string); 
    if (string == NULL) 
     return NULL; 
    string->length = strlen(source); 
    // Make an internal copy of the original 
    // input string 
    string->data = malloc(string->length + 1); 
    if (string->data == NULL) { 
     free(string); 
     return NULL; 
    } 
    // Finally copy the data 
    memcpy(string->data, source, string->length + 1); 
    return string; 
} 

void 
free_string(struct string *string) 
{ 
    if (string == NULL) 
     return; 
    free(string->data); 
    free(string); 
}