2017-09-30 6 views
-1

私はC言語では新しく、関数からポインタ変数にポインタを戻そうとしています。この "[警告]割り当ては、キャストのない整数からポインタを作成します"コンパイラがint 。 mainの前に自分の関数を宣言することはできません。この関数は、 "未定義の参照を` free_block 'にスローします。 "関数からのポインタ

#include <stdio.h> 
#include <stdlib.h> 
    struct block{ 
    int num; 
}; 

int main(int argc, char *argv[]) { 
    struct block *b; 
    b = free_block(); 

    struct block *free_block(){ 
     struct block *b = NULL; 
     return b; 
    } 
    return 0; 
} 

私はCの構文についてはあまり知らないし、ネストされた機能、SOZについてわからなかった

いや、私のせいで、ありがとうございました。 しかし、この場合間違っている可能性があります: 私はmallocまたはcalloc関数を使用せずに自分のメモリアロケータを作ろうとしています。私のコードでは、pointer = free_space_get(size);の行に同じ警告があります。ここでは、func()はネストされていません。main()より前に定義されたメソッドですが、まだ考えていません。私に与えられた答えは、main()の前に関数が定義されるとすぐにうまくいきました。すべての関数の最初に、それらが呼び出される前に宣言する必要があります。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct header{ 
     size_t size; 
     struct header *next; 
     unsigned int free; 
    }; 
void *m_alloc(size_t size){ 
     size_t total_size; 
     void *block; 
     struct header *pointer; 
     if(!size) 
      return NULL; 
     pointer = free_space_get(size); 
     if(pointer){ 
      pointer->free = 0; 
      return (void*)(pointer + 1); 
     } 

    } 
struct header *get_free_space(size_t size){ 
     struct header *b = NULL; 
     return b; 
    } 

int main() { 
    return 0; 
} 
+3

2つの問題として再記述することができます。第二に、Cには入れ子関数がありません。私はあなたが[良い初心者の本をいくつか](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)読むことをお勧めします。 –

+2

関数を呼び出す前に定義または宣言する必要があります。 – Barmar

+1

関数の暗黙的な宣言についての警告も受け取ったはずです。なぜそれをintと定義するのかという手がかりを与えてくれるはずです。 – Barmar

答えて

0

あなたのコードが

#include <stdio.h> 
#include <stdlib.h> 

struct block{ 
    int num; 
}; 

struct block *free_block(){ 
     struct block *b = NULL; 
     return b; 
} 

int main(int argc, char *argv[]) { 

    struct block *b; 
    b = free_block(); 

    if(b == NULL) // Checking whether pointer is returned 
     printf("\n Recieved NULL \n"); 

    return 0; 
} 
関連する問題