2017-04-05 3 views
-3

printf ("pointer = % p \ n", line);C 힙의 연결된 목록 구조체 배열

인용문

인용문

+3

포인터를 typedefing하는 것은 정말 멋지다 ... 정말요? –

+0

@SouravGhosh - 소득 보장. 그것은 하나의 코드가 너무 끔찍해서 아무도 그것을 디버깅 할 수 없도록 만든다. – StoryTeller

+0

나는 잘 모르겠다. 스켈레톤 코드가 그렇게 생겼다. 나는 그게 너무 이상하다고 생각했다. – genericmathstudent

답변

2

음, 코드가 몹시 typedef의 남용과 난독 화 된 사실은 아마 당신과 컴파일러 문제 모두를 향해 먼 길을 간다. 나는이 프로그램에서 하나의 typedef를 직접 가지지 않을 것이다. 여기서 실제 추상화를 제공하지 않습니다. 여기에 내가 (오류 검사의 일부를 생략) 좋을 것 무엇 :

struct cache_line { 
    char valid; 
    mem_addr_t tag; 
    struct cache_line* next; 
}; 

struct cache_line** cache; 

void initCache() 
{ 
    cache = malloc (sizeof(*cache) * S); 
    for (int i = 0; i < S; i ++){ 
     struct cache_line** curr_p = &cache[i]; 
     for (int j = 1; j < E; j++){ 
      *curr_p = malloc(sizeof(**curr_p)); 
      (*curr_p)->valid = 0; 
      (*curr_p)->tag = 0; 
      (*curr_p)->next = NULL; 
      curr_p = &(*curr_p)->next; 
     } 
    } 
} 

키 유의할 것들 :

  1. 내가 모든 형식 정의를 제거했습니다. 그들은 실제적인 목적이 아니라 타이핑을 저장하려는 시도였습니다. 그리고 그들은 코드 품질을 희생시키면서 그것을했습니다. 나는 또한 이전 진술이 그것에도 적용된다고 믿기 때문에 struct에서 그것을 삭제했다.

  2. 메모리를 정식으로 할당했습니다. malloc(sizeof(*pointer_variable))을 작성하면 pointer_variable이 가리키는 것과 관계없이 충분한 메모리가 할당됩니다. 다소 형식에 구애받지 않습니다.

  3. "링크 순회"관용구를 사용하여 연결된 목록을 탐색합니다. "노드"를 추적하는 대신 노드를 가리키는 포인터를 추적합니다. 처음에는 cache[i]이고 반복 할 때마다 새로 할당 된 노드 내부의 포인터가됩니다.