2015-02-10 1 views
0

для потребности моего проекта мне нужно обработать глобальное (представляющее кучу). Это проект C, у меня нет ошибок при компиляции.Как использовать статическую структуру в статической функции? (как глобальный)

, но когда я пытаюсь использовать элемент struct -> segfault.

Если кто-то может сказать мне, где точка?

благодаря

static t_meta *init_get_meta() 
{ 
    static t_meta *allineed = NULL; 
    int   i; 

    i = 0; 
    if (allineed == NULL) 
    { 

     //allineed->pagesize = getpagesize();                       
     //allineed->pagesize = 4096;                         
     allineed->pagesize = 0; --> segfault right here 
     printf("LOVE\n"); 
     while (i < 8) 
     { 
      allineed->listfree[i++] = NULL; 
     } 
     allineed->last = extend_heap(allineed); 
    } 
    return (allineed); 
} 
+4

Y ou не malloc ... вы ссылаетесь на значение NULL – JuniorCompressor

+0

Думаю, вы, ребята, проголосуете, потому что я не объяснил, что я кодировал функцию malloc, теперь я понял, что мне пришлось использовать sbrk спасибо – Gabson

ответ

2

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

if (allineed == NULL) 
    allineed->pagesize = 0; // incorrect at this time allineed is pointing to 0x0 

Что вам нужно сделать, это malloc-структура и проверить, возвращен ли malloc с не значением NULL. что-то на линии

static t_meta *allineed = malloc(sizeof(t_meta)); 
if (allineed) 
{ 
    //do something 
} 
else 
    //return error 

Вы можете посмотреть на эти вопросы, если вы пытаетесь реализовать основной таНос себя

How do malloc() and free() work?

How is malloc() implemented internally?

очень простой таНос будет делать эти основные этапы

void * my_malloc(size_t size) 
{ 
    size_t headersize = 1; // 1 byte header 
    uint8_t alignment = 8; // 8 byte alignment 
    // the block should be 8 bytes align 
    size_t alloc_size = ((size+1)+(alignment-1))&~(alignment-1); 
    //use system call 
    void *head = sbrk(alloc_size); 
    if(head == (void *)(-1)) 
     return NULL; 
    //update the header here to mark the size and other bits depending upon req 
    char *header_val = (char *)head; 
    *header_val = (alloc_size/2) | (1 << 7);//only support power 2 sizes 
    //return updated pointer location to point to ahead of header 
    // after changing the pointer to char type as pointer arithmetic is not allowed on void pointers 
    //printf("allocated size is %d with first byte %p\n",alloc_size,header_val); 
    //printf(" %02x\n",(unsigned char)*(char *)header_val); 

    return (char *)head + headersize; 
} 
+0

На самом деле я кодирую malloc fonction, поэтому я не могу его использовать. – Gabson

+1

все в порядке, но дело в том, что вы не можете получить доступ к памяти, которую вы не выделили, вам нужно выделить память либо в стеке, используя malloc, используя общую память ОС с помощью mmap или shmget. вы можете захотеть взглянуть на этот вопрос http://stackoverflow.com/questions/3479330/how-is-malloc-implemented-internally – cmidi

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