2014-09-10 4 views
-2

에서 배열의 사용 가능한 메모리 :할당하고 나는 구조 다음 한 구조

typedef struct 
{ 
    char *name[10]; 
    char *msg[100]; 
} Log; 

내가 로그 구조에서 이름과 MSG 배열을 어떻게 확보 할 수 있는가? 저는 자유가 동적 할당에만 사용된다는 것을 알고 동적 할당은 구조에서 작동하지 않습니다. 내가 할 수있는 것?

이를 Tryed하지만 오류 제공 :

typedef struct 
{ 
    char *name[] = (char *)malloc(sizeof(char) * 10); 
    char *msg[] = (char *)malloc(sizeof(char) * 100); 
} Log; 

가 나를 도울 수 있습니까? 감사합니다.

+1

당신은 C++로 태그를 붙 였지만 코드가 가장 확실합니다. 어떤 대답을 원하십니까? – TartanLlama

+2

다릅니다. 우선,'char * x []'는 char-ptr 배열입니다. 'char * name [10]'은 당신이 원하지 않는 10 개의 char ptrs를 할당합니다. 'typedef struct {char name [10]; char msg [100];} Log;'는이 필드를 구조체에 인라인으로 할당합니다 ('sizeof (Log)> = 110'). 그렇지 않으면 구조체에 대해 초기화 및 정리 기능을 제공해야합니다. 개인적으로, 그런 경우에는 사용자가 핸들과 만 상호 작용하고 구조체는 직접적으로 사용하지 않게합니다. – IdeaHat

+1

'sizeof (char)'는 정의 1에 해당하므로 쓰지 마십시오. 또한, [malloc (및 친구들)의 결과를 캐스팅하지 마십시오] (http://stackoverflow.com/q/605845). – Deduplicator

답변

3

구조체 선언은 멤버에 메모리를 할당하지 않습니다. 구조체의 인스턴스가 생성되면 메모리가 할당됩니다. 그래서

typedef struct 
{ 
    char *name[10]; 
    char *msg[100]; 
} Log; 

는 그냥 새로운 데이터 (정의 된 사용자) 입력 Log를 선언 namemsg 메모리를 할당하지 않습니다. 당신이 그것의 인스턴스를 만들 때

Log log_flie; 

메모리는 namemsg에 할당된다. 지금 당신은 마찬가지로 당신이 msg을 위해 할 수있는

for(int i = 0; i < 10; i++) 
    log_file.name[i] = malloc(N); //N is the desired size 

으로 데이터 멤버의 요소에 대한 메모리를 (동적) 할당 할 수 있습니다. 그런 다음

typedef struct 
{ 
    char **name; 
    char **msg; 
} Log; 

다음과 같이

동적으로 할당 된 메모리을 확보 동적 namemsg 메모리를 할당하려면 다음을 수행 free
for(int i = 0; i < 10; i++) 
    free(log_file.name[i]);  

으로 호출하려면
Log log_file; 
log_file.name = malloc(10 * sizeof(char *)); 
log_file.msg = malloc(100 * sizeof(char *));