2011-12-14 3 views
1

는이 같은 구조체를 만든 :의 malloc, 구조체

struct a{ 
    char *name; 
    char *value; 
    struct a *next; 
}; 

내가 처음에 메모리를 malloc에, 괜찮아, 내가 '이름'과 '가치'해당 값을 설정할 수 있습니다. 하지만 두 번째로 malloc을 사용하면 오류가 발생합니다. 그리고 그것은 cgi입니다, 그냥 "500 Internal server error"라고 말해주세요.

'name'및 'value'포인터를 array로 변경하면 모든 것이 작동합니다.

아마도 컴파일러는 할당 할 메모리 양을 알지 못할 것이라고 생각했습니다.

그리고이 아이디어가 있습니까? 모든 대답을 고맙게 생각합니다!

+5

"a-> name"또는 "a-> value"값에 직접 저장했거나 _them_에 대한 메모리를 할당 했습니까? – sarnold

+0

메모리를 할당하지 않고 직접 값을 저장합니다. 그리고 Keith Thompson이 논평 한 바와 같이, 나는 name과 a-> value를 위해 메모리를 할당한다. 차이점을 아십니까? 고맙습니다! – trinity

답변

2

mallocsizeof(struct a)과 함께 사용하면 포인터 이름과 값을 저장할 충분한 공간을 할당 할 수 있습니다. 이 배열을 char 배열로 만들려면 a의 각 인스턴스에 대해 어느 정도 공간을 확보해야하는지 알 수 있습니다.

+0

고마워요, LaceySnr. 너는 나보다 더 잘 이해한다. 그것은 나에게 분명해진다. – trinity

3
struct a { 
    char *name; 
    char *value; 
    struct a *next; 
}; 

struct a *head = malloc(sizeof *head); 

단일 struct a 개체에 대한 위의 할당 공간,하지만 했나의 struct a에 포함 된 세 가지 포인터를 초기화하지 않습니다. 당신이 문자열을 가리 키도록 namevalue를 원하는 경우 특히, 당신은 그 문자열을위한 공간을 할당해야합니다 :

head->name = malloc(5); 
strcpy(head->name, "Fred"); 
head->value = malloc(8); 
strcpy(head->value, "abcdefg"; 

이 상당히 과도하게 단순화된다. 58은 "마법 숫자"입니다. 초기 값을 변경하면 일관성있게 유지되는 방식으로 크기를 지정해야합니다. 그리고 은 항상이어야합니다. malloc()이 null 포인터를 반환하는지 확인하십시오 (오류 메시지가있는 프로그램을 종료하는 경우에도 마찬가지입니다).

당신이 할당 된 메모리의 일부 덩어리를 가리 키도록 namevalue를 초기화하지 않는 경우

, 당신 여전히합니다 ( malloc의없이 위의 strcpy의를 수행하여, 예를 들면)가 가리키는 파일을 초기화 할 수 있습니다. 보다 정확하게는 시스템이 오류를 반드시 진단하지는 않습니다.

마지막으로 malloc() 호출에 해당하는 free()이 필요합니다.

이것은 주로 설명에 기반한 것입니다. 실제 코드를 우리에게 보여 주면 더 잘 도와 드릴 수 있습니다.

+0

네, 맞습니다. 방금 너의 방법을 시험해 봤어. 그것은 작동합니다. 그러나 한가지 더 질문 할 때,'head-> name = malloc (5)'를 사용할 때, malloc을 원하는 크기를 알아야합니다. 프로세스는 다음과 같습니다. 길이를 cacluate 한 다음 malloc. 그러나 나는 그것이 효율성이라고 생각하지 않는다. 다시 감사합니다! – trinity

+0

길이를 계산하는 방법은 데이터의 출처에 따라 다릅니다. 이름으로 사용하고자하는 문자열을 가리키는'name'이라는'char *'포인터가 있다면'head-> name = malloc (strlen (name) + 1); if (head-> name == NULL) {/ * 할당 실패 * /} strcpy (head-> name, name);'. 예를 들어.('+ 1'은 문자열을 끝내는 '\ 0'널 문자를 유지하는 데 필요합니다.) –

+0

여기에 "search = stackoverflow & keyword = malloc & language = en & else = null"과 같은 qeury 문자열을 구문 분석하고 싶습니다. 그래서 나는 이것을 할 효율적인 방법을 찾을 수 없다. – trinity