2013-04-09 2 views
-1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

#include "mystuff.h" 

typedef struct Node 
{ 
     int size; 
     int status; 
     struct Node *next; 
     struct Node *previous; 
} Node; 


Node *endNode; 
Node *rootNode; 

void *my_foo(int size) 
{ 
     Node *theNode; 
     void *ptr; 

     if (rootNode->next == NULL) 
     { 
       theNode->status = 1; 
       ... 

Это segfaults на «rootNode-> == NULL», но если я изменил это на «rootNode == NULL», тогда он будет segfaults, когда он достигнет «TheNode-> status = 1» и объявит theNode и rootNode как NULL не помогают.Почему этот SEGFAULT? (небольшой код)

+3

use $ valgrind ./yourprogram –

+0

Я valgrind, и он сказал мне «Использование неинициализированного значения размера 4», но я не вижу, где именно точно – theman

+0

Похоже, вы задаете тот же вопрос, что и ваш другой один (http://stackoverflow.com/questions/15892342/making-custom-malloc-what-is-wrong-here), за исключением того, что вы, похоже, оставили много необходимых битов реализации ... – jamesdlin

ответ

1

... и объявить theNode и RootNode, как NULL не помогает.

NULL Разыменование (обычно) будет результат в Segfault. Вы должны установить их в нечто более полезное (например, выделенную структуру), прежде чем вы их измените!

+0

Спасибо! Ценить это. Вы знаете, как я могу объявить rootNode началом кучи? – theman

+0

Не делай этого. Используйте 'malloc'. – nneonneo

0

Я не вижу rootNode, даже присваиваемого, находящегося в статическом пространстве, поэтому он содержит константу nullptr. Вы разыскиваете его с помощью оператора ->, поэтому это невозможно. Сначала сделайте это на каком-нибудь объекте!

+0

благодарит вас! Вы также знаете, как я могу заставить rootNode быть началом кучи? – theman

+0

Если вы говорите о своем пространстве кучи процесса, то нет, вы не можете контролировать это. Если вы хотите, чтобы большая линейная область памяти воспроизводилась внутри, просто создайте символ char * myheap = new char [virtualHeapSize]; 'В этом случае в соответствии с вашим кодом вы хотите сделать двойной связанный список. Поэтому ваша первая ссылка должна быть выделена с помощью 'rootNode = new rootNode;' Где-то в операции Push(), управляемой клиентским кодом. Вы можете скопировать этот Push() в структуру узла и вызвать его из main(). –

+0

@ v.oddou: 'void * myheap = malloc (virtualHeapSize);' вероятно, будет работать лучше, учитывая, что это C. :) – cHao

0

Выделение указателя NULL приведет к ошибке сегментации.

Можно только предположить, что rootNode NULL, так как он вводит кодовый блок при изменении состояния на if(rootNode == NULL). Можно было бы предположить, что это происходит потому, что оно никогда не было назначено.

Кроме того, вы явно не устанавливался theNode, чтобы указать на что-либо, так что линия theNode->status попытается разыменованием theNode, что указывает на ... кто знает что.

Назначить значения вашим переменным.

Смотрите также: http://en.wikipedia.org/wiki/Segmentation_fault

+0

ОК, спасибо! Поэтому, если бы я хотел сделать rootNode началом моей кучи, я бы сделал что-то вроде 'rootNode = sbrk (0)'? – theman

+0

Пожалуйста, никогда не используйте 'sbrk' себя. Просто придерживайтесь 'malloc'! – nneonneo

0

Вы выделяете память для rootNode перед использованием полей (я имею в виду rootNode-> следующую операцию)? Если нет, используйте malloc до, например: rootNode = (struct Node *) malloc (sizeof (Node)). Кажется, что вы делаете двойной связанный список, также может быть хорошей идеей предопределить struct Node * next = NULL;

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