-3
A
답변
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;
}
}
}
키 유의할 것들 :
내가 모든 형식 정의를 제거했습니다. 그들은 실제적인 목적이 아니라 타이핑을 저장하려는 시도였습니다. 그리고 그들은 코드 품질을 희생시키면서 그것을했습니다. 나는 또한 이전 진술이 그것에도 적용된다고 믿기 때문에
struct
에서 그것을 삭제했다.메모리를 정식으로 할당했습니다.
malloc(sizeof(*pointer_variable))
을 작성하면pointer_variable
이 가리키는 것과 관계없이 충분한 메모리가 할당됩니다. 다소 형식에 구애받지 않습니다."링크 순회"관용구를 사용하여 연결된 목록을 탐색합니다. "노드"를 추적하는 대신 노드를 가리키는 포인터를 추적합니다. 처음에는
cache[i]
이고 반복 할 때마다 새로 할당 된 노드 내부의 포인터가됩니다.
포인터를 typedefing하는 것은 정말 멋지다 ... 정말요? –
@SouravGhosh - 소득 보장. 그것은 하나의 코드가 너무 끔찍해서 아무도 그것을 디버깅 할 수 없도록 만든다. – StoryTeller
나는 잘 모르겠다. 스켈레톤 코드가 그렇게 생겼다. 나는 그게 너무 이상하다고 생각했다. – genericmathstudent