2017-01-29 2 views
-3

私はデータ構造が配列である単純なスタック操作を書いています。スタック上でのrealloc()の使用

#define DEFAULT_VAL 10  //in a separate Header file 
int *stacky = (int*) malloc (default_size * sizeof(int)); 

目的は、要素が失われないようにしながらスタックのサイズを動的に設定する関数を作成することです。ここで

は、私がこれまで持っているものです。私のmain()機能で

void Sizer(int size) 
{ 
    #undef DEFAULT_VAL 
    #define DEFAULT_VAL size 
    maxSize = size; 
    int *newbuffer = (int*) realloc (stacky, size); 
    if(newbuffer == NULL) //checking if the 'realloc' was successful :) 
    { 
     printf("PROBLEM HERE :)");    
    } 
    else 
    { 
     stacky = newbuffer;  
    } 
} 

int main() 
{ 
    int i; 
    for(i=1; i<15; i++) 
    { 
    push(i); 
    } 
    Sizer(9); 
    displayStack(); 
    Sizer(17); 
    displayStack(); 
} 

出力は次のとおりです。

DEFAULT_VAL is now: 9 
     9. 9 
     8. 8 
     7. 7869816 
     6. 7877384 
     5. 17278 
     4. 385207786 
     3. 3 
     2. 2 
     1. 1 

DEFAULT_VAL is now: 17 
     9. 9 
     8. 8 
     7. 7869816 
     6. 7877384 
     5. 17278 
     4. 50331651 
     3. 3 
     2. 2 
     1. 1 

何かアドバイスは歓迎です! manページから感謝

+0

'#define'は(変数として)使用しようとする方法では使用できません。 – tkausl

+0

'stacky'をどこで定義するのかは100%明確ではありませんが、C言語では変数が関数の外にあるときに表示されるような初期化子を書くことはできません。 –

+1

なお、コード内の 'のボイドサイザー(int型のサイズ) {/ *改行*/ DEFAULT_VAL #undefの/ *改行*/ の#define DEFAULT_VALサイズ/ *改行*/ maxSizeと=サイズ;'、あなたはしないでください実際には 'DEFAULT_VAL'を使用します。 'size'の定義は奇妙です。プリプロセッサはコンパイル時にテキスト置換を行います。コードはうまくいくかもしれませんが、プリプロセッサを使ってやろうとしていることをやっているのは、特にマクロが実際には使われていないためです。 –

答えて

2

のrealloc()関数は、メモリブロックのサイズが大きバイトにptrが を指摘変更します。

ので、代わりの:

int *newbuffer = (int*) realloc (stacky, size); 

あなたはおそらくところで

int *newbuffer = (int*) realloc (stacky, size * sizeof(int)); 

したくない:キャストの必要性mallocを使用して、友人なしに。 Do I cast the result of malloc?

+0

それを感謝します!キャストを削除した後、私はエラー無効な変換を 'void *'から 'int *'に変換します。 – Arjun

+0

@Arjun - 'invalid conversion'で奇妙に聞こえる - Cコンパイラの代わりにC++コンパイラを使用していますか? – 4386427

+0

私はDev-C++を使用しています! – Arjun

関連する問題