2012-04-26 5 views
0

저는이 간단한 문제는 확실하지만 구조체의 동적 배열을 구현하는 데이터 구조를 만들려고합니다.구조체에 대한 포인터의 동적 배열은 멤버 변수 지정시 SIGSEGV를 throw합니다.

각 구조체는 링크 된 목록을 구현합니다.

그래서 각 목록의 머리를 가리키는 포인터 배열이 필요하다고 생각합니다. 어떤 이유로, 메소드 변수를 지정하면 segault가 발생합니다. 나는 네가 할 수 있다면 내가 잘못하고있는 것에 대해 약간의 설명을 좋아할 것이다. 감사!

아, 또한이 모든 것이 캐시라는 클래스 안에 있으므로 정의되지 않은 일부 변수가있는 것이지만 그렇다고 확신합니다. 인덱스 [i] -> next = NULL에서 프로그램 seg faults; 그 밑에 비슷한 줄이있다.

 typedef struct setNode { 
    char valid, dirty; 
    unsigned int tag; 
    setNode *next; 
    Cache *nextCache; 

} set; 
    set **indexes; 

    arrayLength = cache_size/block_size; 

    indexes = new setNode *[arrayLength]; 

    set *temp; 

    //Step through the array. The array is full of pointers to "Dummy Nodes" 
    for (size_t i = 0; i < arrayLength; i++) { 
     indexes[i]->next = NULL; 
     indexes[i]->valid = 0; 
     indexes[i]->dirty = 0; 
     indexes[i]->tag = 0; 
     //create empty linked list for each tag spot (One for direct mapped. etc...) 

     for(size_t i = 0; i < associativity; i++) 
     { 
     temp = indexes[i]; 
     temp->next = new setNode; 
     temp = temp->next; 
     temp->next = NULL; 
     temp->valid = 0; 
     temp->dirty = 0; 
     temp->tag = 0; 
     } 

    } 

} 

답변

1

indexesset는 오브젝트 포인터 배열이지만, 그들이 초기화된다. 그들은 실제 set 개체를 가리 키지 않고 단지 임의의 메모리 위치를 가리 킵니다. 임의의 메모리에 쓰려고하면 세분화 위반의 본질입니다. 나는 인덱스를 추가 ... 즉,

가 이
for (size_t i = 0; i < arrayLength; i++) { 
    indexes[i] = new set; 
    indexes[i]->next = NULL; 
    indexes[i]->valid = 0; 
    ... 
+0

오른쪽, 즉 의미가 [내가] = 새로운 세트를 -

는 포인터를 사용하기 전에, 당신은 set 객체를 할당하고 그들에게 포인터 지점을 만들 필요가 for 루프의 맨 위에서 이제는 작동합니다. 감사! 바보 같은 날, 나는 구조체와 클래스를 초기화 할 필요가 있다는 것을 알지 못했지만 배열에는 포인터가 있기 때문에 의미가있다. – usssrrrrrr1