2016-04-07 3 views
0

У меня есть один размерный массив указателей, который я использую для хранения головок связанных списков. Я заявляю это и заполнить эти заявленияОшибка сегментации в копировании заголовка связанного списка

struct node { long int val; struct node *next; }; //Our node structure 
struct node **pointArray; 
pointArray = malloc(size_Of_array * sizeof(struct node *)); 
for (z =0; z<sizeof(pointArray); z++) 
    pointArray[z] = NULL; 
/* 
do something else 
... 
... 
*/ 
while(numRead <= bytesPerThread) //loop1 
{ 
    m = read(fd, buff, sizeof(buff)); 
    numRead += m; 
    if (m < 0) 
     handle_error("Read error\n"); 
    else 
    { 
     for (i=0; i< m; i++) //loop2 
     { 

      if (buff[i] == '#') 
       while(buff[i] != '\n') 
       { 
        i++; 
        continue; 
       } 
      else //else 2 
      { 
       if(buff[i] !=' ' && buff[i]!='\n' && buff[i] !='\t') 
       { temp[a] = buff[i]; 
        a++; 
       } 
       else //else 1 
       { Node = atoi(temp); 
        a = 0; 
        for (x=0; x< 15; x++) 
         temp[x] = '\0'; 
        if ((buff[i] == ' ' || buff[i] == '\t') && curruntNode == -1)//just for first time 
        { 
         head = (struct node*) malloc(sizeof(struct node)); 
         head->val = Node; //create first node, i.e. head 
         head->next = NULL; 
         current = head; //Set current node to head 
       pthread_mutex_lock(&myLock); 
         pointArray[Node] = head; 
       pthread_mutex_unlock(&myLock); 
         curruntNode = Node; 
        } else 
        if (buff[i] == '\n') 
        { 
         temp2 = (struct node*) malloc(sizeof(struct node)); 
         temp2->val = Node; 
         temp2->next = NULL; 
         current->next = temp2; 
         current = temp2; 
        } else 
        if ((buff[i] == '\t' || buff[i] ==' ') && curruntNode != Node) 
{head = (struct node*) malloc(sizeof(struct node)); 
head->val = Node; //create first node, i.e. head 
head->next = NULL; 
current = head; //Set current node to head 
pthread_mutex_lock(&myLock); 
if (pointArray[Node] == NULL) 
{ 
pointArray[Node] = head;} 
else 
{ 
current = pointArray[Node]; 
while (current->next != NULL) 
{ 
    current = current->next; 
} 
current->next = head; 
current = head; 
} 
pthread_mutex_unlock(&myLock); 
curruntNode = Node;} 

Тогда я объявляю указатели искать в каждом связанном списке

for (j = NodesToSeek; j < NodesPerThread; j++) 
{printf("hee"); 
    if (pointArray[j] == NULL) 
     {printf("Null");continue;} 
    else 
    { 
     firstNode = pointArray[j]; 
printf("1node %ld",firstNode->val); 
     firstNode = firstNode ->next; 
     while (firstNode != NULL) 
     { 
      move = firstNode; 
      while (move != NULL) 
      { 
       comparedNode = pointArray[firstNode->val]; 
       comparedNode = comparedNode->next; 
       while (comparedNode != NULL) 
       { 
        if (comparedNode->val == move->val) 
        { 
       pthread_mutex_lock(&myLock); 
         tringles++; 
       pthread_mutex_unlock(&myLock); 
        } 
        comparedNode = comparedNode->next; 
       }//end while 
       move = move->next; 
      }//end while 
      firstNode = firstNode->next; 
     }//end while 
    }//end else 
}//en 

Проблема возникает в этом заявлении

comparedNode = comparedNode->next; 

Этот указатель остается нулевой Может ли кто-нибудь сказать мне, почему это происходит?

+0

Они не имеют смысла: 'head-> Вэл = Node;', 'pointArray [Node] == NULL' и т.д. Где/что такое определение' Node'? –

+0

это int. У меня есть число узлов, у каждого из которых есть список смежности, поэтому мне нужно ссылаться на номер узла как индекс одномерного массива –

ответ

0
pointArray = malloc(size_Of_array * sizeof(struct node *)); 
for (z =0; z<sizeof(pointArray); z++) 
    pointArray[z] = NULL; 

sizeof (pointArray) возвращает размер указателя в байтах в вашем примере, а не количество элементов в массиве. Если size_Of_array < sizeof (pointArray), то некоторые из массивов не инициализируются, что делает следующий код довольно опасным.

// It's possible pointArray[Node] is not initialized here 
if (pointArray[Node] == NULL) 
{ 
    pointArray[Node] = head; 
} 
else 
{ 
... 

Вы уже знаете размер массива, поэтому просто используйте это для цикла.

pointArray = malloc(size_Of_array * sizeof(struct node *)); 
for (z =0; z<size_Of_array; z++) 
    pointArray[z] = NULL; 
+0

Я использовал 'size_Of_array', но проблема все еще происходит –

+0

Узел между 0 и size_Of_array – Pemdas

+0

Да, он ограничен. Я в замешательстве. Правильно ли объявление массива одномерных указателей? –

Смежные вопросы