2012-02-06 2 views
0

초보자 여기,주소에 데이터를 저장하고 C에서 변수의 주소를 변경 하시겠습니까?

구조체에 단어 (구조체에 내 질문과 관련없는 다른 기능이 있음)가 포함 된 단어 구조체가 있는데이 구조체를 단어 구조 포인터의 배열 인 hashmap. 내 프로그램에서, 새로운 단어를 볼 때마다 새로운 단어 구조체를 만들고 malloc char 배열을 만들어 그것을 만든다. 그러나 루프를 몇 번 실행하면 이전 단어가 다른 해시 맵 위치에 있더라도 새 단어로 바뀝니다.

내가 새로운 단어 구조체를 새로운 주소로 생성하는 루프를 가질 수 있다면 궁금한 점은 무엇입니까?

struct words add; 
int b; 
for(b = 0; b < strlen(LowerCaseCopy); b++) 
{ 
    add.word[b] = '\0'; 
} 
for(b=0;b< strlen(LowerCaseCopy);b++) 
{ 
add.word[b] = LowerCaseCopy[b]; 
} 
hashmap[hashf] = &add; 

이것은 문제의 코드입니다.

내 문제의 예 : 루프의 첫 번째 실행, 나는 특정 해시 맵 슬롯에 저장된 apple에 add.word를 설정했습니다. 루프의 다음 실행 단계에서 add.word를 오렌지색으로 설정하고 다른 슬롯에 저장합니다. 문제는 첫 번째 슬롯에서 더 이상 사과를 저장하지 않고 대신 오렌지색을 저장한다는 것입니다. 따라서 오렌지색을 저장하는 2 개의 슬롯이 있는데, 이는 내가 원하는 바가 아닙니다. 이 문제를 어떻게 해결할 수 있습니까?

+0

어떻게'hashf '값을 얻습니까? 그것은 이제까지 변화 되었습니까? – Philip

+0

'b

+0

예, hashf가 변경되었습니다. 이것은 제 코드의 섹션 일 뿐이므로이 섹션이 루프에 있습니다. 루프의 각 반복에서 변수를 재사용하면 주소가 변경되지 않습니까? – Kevin

답변

0

간단한 솔루션 (나는 생각한다)은 별도의 기능으로 해시 맵에 항목을 추가하는 기능을 넣는 것입니다. 이 기능은 새로운 words 구조를 할당하고 해시 맵에 있음을 박았 :

void add_to_hashmap(struct something *hashmap, char *lower_case_word) 
{ 
    /* Using "calloc" we don't have to manually clear the structure */ 
    struct words *words = calloc(1, sizeof(struct words)); 

    /* Copy +1 to include the terminating '\0' */ 
    memcpy(words->word, lower_case_word, strlen(lower_case_word) + 1); 

    /* Replace this with whatever you use to calculate the hash */ 
    int hashf = calculate_hash(lower_case_word); 

    hashmap[hashf] = words; 
} 

당신이 항목을 제거하면 (즉 NULL로 설정)를 처음 무료로 기억해야합니다.

+0

굉장! 내가 할 수 있으면 너를 안아 줄거야! 정말 고마워! 당신의 도움을 주셔서 감사합니다 – Kevin