2017-10-10 11 views
1

私は、mallocでポインタを使用してシミュレートされた2D配列を持っており、sizeof()がポインタのサイズを返すので、その配列のサイズを取得します。 私のコード(ANSI C):事前にmallocを使用してシミュレートされた配列のサイズを取得

size(rack) //returns 10 
size(rack[0]) //returns 15 

ありがとう:

void main(){ 
    int s1=10; 
    int s2=15; 
    int ** rack=(int**)malloc(s1*sizeof(int**)); 
    for(int i=0; i<s1; i++) rack[i]=(int*)malloc(s2*sizeof(int*)); 
} 

私は機能(システムによって、それを自分で行う場合があります)この方法をしたいです! (詳細はGNU/Linuxを使用しています)

+2

[ポインタ配列へのポインタは実際には2次元配列ではありません](https://stackoverflow.com/q/42094465/694733)。また、ANSI Cは旧式の古いバージョンのCを指します。 Linuxを使用している場合は、C11にアップグレードすることが可能です。 – user694733

+3

良い習慣は、 'malloc'で型を使って' sizeof'を行うのではなく、ポインタが 'malloc(s1 * sizeof * rack)'を指し示すと思われるオブジェクトを使うことです。また、Cでは 'malloc'や友人の返却をキャストすべきではありません。 –

+1

あなたがmallocに間違った量のスペースを割り当てた場合 –

答えて

0

まず、2D配列にメモリを割り当てる方法は間違っています。常にcheck malloc's resultともnot to cast malloc's resultに覚えておいてください

void main(){ 
    int s1 = 10; 
    int s2 = 15; 
    int** rack = malloc(s1*sizeof(int*)); 
    if (rack == NULL) 
     return; 
    for(int i=0; i<s1; i++) { 
     rack[i]=malloc(s2*sizeof(int)); 
     if (rack[i] == NULL) 
      return; 
    } 

    ... 

    free(rack); 
    return; 
} 

:あなたはそれを変更する必要があります。あなたはints1ポインタが割り当てられているよう

あなたの配列のサイズを取得するためには、それぞれがs2int Sを保持し、s1*s2*sizeof(int)を印刷することができます。

+0

割り当てたメモリをすべて解放していないことに注意してください。 –

+0

@Bob__私は割り当ての部分だけに答えたので、私はしませんでした。私はOPが彼の記憶を解放したと思ったが、私たちには最小限の部分しか示していなかった。 – Marievi

+0

'int'と' size_t'の範囲が異なるため、 'sizeof(int)* s1 * s2 *'はそうではありませんが、 's1 * s2 * sizeof(int)'はオーバーフローする可能性があります。 IAC、array indexingとsizeに 'int'よりも' size_t'を使うほうが良いです。 – chux

関連する問題