2015-05-02 3 views
3

Я получаю ошибкуКонфликтующие типы «свободных»

конфликтные ситуации для «свободных»

при вызове функции free() ниже.

int main () 
{ 
    char fx [] = "x^2+5*x-1"; 
    node * fxNode = buildTree(fx, sizeof(fx)/sizeof(char)); 
    printf(deriveFromTree(fxNode)); // Should print "2*x+5" 
    free(fxNode); 
    return 0; 
} 

Не могу понять, почему. Не уверен, что если этот вопрос, но то, что над ней

#include <stdio.h> 

char opstack [5] = {'+','-','*','^', '\0'}; 

unsigned short int lowerOpPrecedence (char, char, char *); 

int stringToUnsignedInt (char *, unsigned int *); 
int stringToDouble (char * , double *); 
unsigned short int stringCompare (char * , char *); 
void stringCopy (char * , char *); 

typedef struct treeNode 
{ 
    char * fx; 
    char * op; 
    struct treeNode * gx; 
    struct treeNode * hx; 
} node; 


unsigned short int getNodeState (node *); 
node * buildTree (char *, int); 
char * basicDerivative (char *); 
char * derivateFromTree (node *); 

и что под ней есть куча реализаций функций.

ответ

7

Чтобы предоставить прототип для free(), вам необходимо добавить #include <stdlib.h>.

Также рекомендуемая подпись для main(): int main (void).

+0

Dang it. Я пытаюсь написать программу с нуля - нет библиотек, кроме ''. Есть ли способ для меня реализовать «свободную» функцию с нуля? –

+0

@FiredfromMicrosoft '' не является библиотекой, это файл заголовка. Если вы не хотите включать заголовочный файл, вы можете добавить прямое объявление в свой исходный код. –

+1

Написание 'free' с нуля звучит как изобретать колесо. Зачем вам это делать? –

0

если ваш командный файл линкера содержит конкретное определение кучи, в том числе этикетки на начальный адрес и длина этикетки,

, то вы можете написать свою собственную версию таНос, свободный, перераспределить, calloc и т.д.

BTW: код вызывает «free»() «Как было выделено выделение памяти, что« free() »будет возвращаться в кучу?

1

Вы могли бы реализовать ваш malloc и free выше некоторой операционной системы памяти address space примитивы (изменяющие virtual memory вашего process), как (на Linux) mmap(2) и munmap. Подробная информация о конкретной операционной системе.

Кстати, если ваша цель состоит в том, чтобы написать программу, используя только <stdio.h> большинство реализаций него внутренне, используя malloc, поскольку буфер внутри каждого FILE, как правило, некоторые динамически распределяемой байт зоны (так конкретно, то, как правило, выделяется через malloc) , Другими словами, реализация fopen очень вероятно использует malloc; см. также this. Поэтому, если вы принимаете, чтобы включить <stdio.h> вы должны принять, чтобы включить <stdlib.h> ...

Обратите внимание, что несколько standard C libraries (а.к.а. libc) являются free software; вы можете изучить и улучшить исходный код GNU glibc или musl-libc.

См. Также this answer связанный с этим вопрос.

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