2013-11-28 2 views
0

배열의 각 인덱스에 대해 키와 정보가있는 배열이 있습니다.배열 구조가 올바르게 작동하지 않습니다.

이것은

table_t *table_construct (int table_size, int probe_type) 
{ 
    int i; 
    table_t *hash; 
    if(table_size < 1) return NULL; 

    hash = malloc(sizeof(table_t)); 
    hash->table = malloc(sizeof(list_t*) * table_size); 
    for(i=0; i < table_size - 1; i++) 
    { 
     hash->table[i] = NULL; 
     //hash->table[i]->next = NULL; 
    } 
    hash->size = table_size; 
    hash->probing_type = probe_type; 
    return hash; 
} 

그래서 나는 list_t과 table_t 구조를 가지고 배열을 작성합니다.

hash->table[item]->K = K; 

그것은 내 코드의이 부분에서 볼 수있다 : : 나는 그것을 GDB 때

int dec, item, hold; 
     item = hashing(hash,K); 
     hold = item; 
     if(hash->table[item] == NULL) 
     { 
      hash->table[item]->K = K; 
      hash->table[item]->I = I; 
      return 0; 
     } 

, K이 숫자 I가 제대로 작동하지 않습니다 내 코드에 다음 줄이있다.

그래서 여기서 일어나는 일은 항목으로 색인이 생성 된 표가 있습니다. 그런 다음 색인의 키에 K를 추가합니다. 이 라인이 내 프로그램의 어느 곳에서나 나타날 때 나는 seg fault를 얻는다.

내가 여기서 잘못한 것을 볼 수 있습니까?

+0

음, 'table' 배열에 메모리를 할당 했습니까? 그리고'table' 엘리먼트에서 가리킨 각각의 개별'list_t' 객체에 메모리를 할당 했습니까? 당신이 어떻게하는지 우리에게 보여줘야 해. – AnT

+0

'table'에 항목을 할당하는 방법을 모르면 도움이 될 것입니다 ... – John3136

+0

지금 내 생성 기능을 추가하십시오. – user081608

답변

0

table_construct 함수에 게시 한 내용에 따르면 table 배열의 요소는 null 포인터입니다. 널 포인터를 통해 어떤 종류의 액세스도 수행 할 수 없습니다.

그리고 이것은 단지하지 않습니다 의미가 여기에

if(hash->table[item] == NULL) 
    { 
     hash->table[item]->K = K; 
     hash->table[item]->I = I; 
     return 0; 
    } 

당신은 널 포인터를 통해 데이터를 쓸 수있는 명시 적 시도를합니다.

포인터를 통해 쓰기 (읽기)를 시도하기 전에 포인터가 올바른 개체를 가리키는 지 확인해야합니다. 함수의 table_construct에서

if(hash->table[item] == NULL) 
    { 
     hash->table[item] = malloc(sizeof(list_t)); // you were missing this. 
     hash->table[item]->K = K; 
     hash->table[item]->I = I; 
     return 0; 
    } 
+0

좋아요, 그래서 내가 NULL을 만드는 줄을 제거한다면, 더 이해가 되겠습니까? – user081608

+0

@ user081608 : 해당 행을 삭제하면 도움이되지 않습니다. 당신은이 포인터를 어딘가에서 의미있는 곳으로 향하게해야합니다. 이러한 포인터가 가리킬 객체를 * 생성 *해야합니다. 여기에서 생각해 볼 수있는 질문은 포인터가 가리켜 야 할 곳을 모른다면 왜'포인터'배열을 포인터로 만들었습니까? 왜 포인터 대신'list_t' 객체 배열을 만들지 않았습니까? – AnT

+0

죄송합니다.이 기능을 만들 때 혼자 혼란 스러울 수도 있습니다. 내 malloc이 테이블 크기를위한 공간을 만들지 않습니다. 그런 다음 [0-n] 테이블을 할당해야합니다. 나는 라인 해쉬 -> table [i] -> K = 0. 모든 키를 = 0으로 만드는 것을 의미한다고 생각한다. 그러나 그렇다고하더라도 각 배열의 어딘가를 만들 필요가 있다고 말하는가? – user081608

1

당신은 당신이 뭔가를 할당해야 그것은 당신이 떨어져 참조 할 수 있습니다 전에 귀하의 포인터가 null 확인 이.

hash->table = (list_t **)malloc(sizeof(list_t*) * table_size); 
for (i=0;i<table_size;i++) 
{ 
    hash->table[i] = (list_t *)malloc(sizeof(list_t)); 
} 

이렇게하고 싶다면 null로 지정하십시오.

memset(hash->table[i],0,sizeof(list_t)); 

그런 다음이 판단 문을 사용할 수 있습니다.

if(hash->table[item] != NULL) 
{ 
    hash->table[item]->K = K; 
    hash->table[item]->I = I; 
    return 0; 
} 
+0

고맙습니다. 해당 라인을 생성 기능에 추가 할 수 있습니까? – user081608

+0

또한이 줄은 잘못되었습니다. – user081608

+0

신경 쓰지 마세요. 작동하고 있어요. – user081608

0

처럼 당신이 malloc을 hash-> 테이블, 당신은 그것을해야 할 때 :

+0

고마워요. 그러나 중간 문장은 무엇을 의미합니까? – user081608

+0

메모리 블록을 0으로 채 웁니다. – qdd

관련 문제