일부 데이터의 주소를 배열에 저장해야합니다. 모든 데이터는 "dagNode"유형의 구조입니다. 작업을 수행하기 위해 목록을 방문하고 주소를 기록 할 데이터의 수를 세어 메모리에 적절한 공간을 할당하고 마지막으로 목록을 다시 방문하여 일부 데이터의 주소를 저장합니다.구조체에 대한 포인터 배열을 사용하는 동안 세그먼테이션 오류가 발생했습니다.
struct dagNode *buildBST(struct dagNode *rootList){
struct dagNode *head, **xTest;
head = rootList;
int numXtest=0;
rootList = nextNode(TYPE_XTEST, rootList);
while (!IS_TERMINATED(rootList)){ // first visit
numXtest++;
rootList = nextNode(TYPE_XTEST, rootList); }
xTest = (struct dagNode **) malloc(sizeof(struct dagNode) * numXtest);
int i=0; rootList = nextNode(TYPE_XTEST, head);
for(i=0; i<numXtest; i++){ // second visit, saving the address of some datas
rootList = nextNode(TYPE_XTEST, rootList);
xTest[i] = rootList; i++;
>>> printf("t=%d,val=%d\t", xTest[i]->nodeType, xTest[i]->val); } // segmentation fault
return head;
}
는 편집 :
struct dagNode *nextNode(int typeOfNextNode, struct dagNode *node){
if (IS_TERMINATED(node)){ return node; }
node = node->next;
if (typeOfNextNode == TYPE_EDGE_OR_GAP){
while (!IS_TERMINATED(node) && !IS_AN_EDGE(node) && !IS_A_GAP(node)){
node = node->next; }
}else
{
while (!IS_TERMINATED(node) && (node->nodeType != typeOfNextNode)){
node = node->next;}
}
return node; }
우리에게'nextNode' 함수를 보여주세요. – cnicutar
디버거에서 코드를 실행하여 문제를 격리 할 수 있습니다. –
그것은 오랜 시간 동안 본 가장 이해하기 어려운 코드 레이아웃입니다. 제발, 모든 사람들을 위해서, 좀 더 정통적인 형식을 채택하십시오. 적어도 if와 else는 수직으로 정렬되어야하고,'}'는 줄의 시작 부분에 있어야하며 끝 부분에 숨겨져 있지 않아야합니다. –