0

4 つの要素を持つ配列をint関数に渡してsizeof(array)/sizeof(array[0])いますが、要素が少ないと言っています。

何が起こっているかの例を次に示します。

int
main() {
  // declaring literal array
  int array[] = {1,2,3,5};

  // prints 16/4 (correct output for 4 elements)
  printf("%d/%d\n", sizeof(array), sizeof(array[0]));

  function(array);

  return 0;
}

void
function(int array[]) {
  // printing 8/4 instead of 16/4
  printf("%d/%d\n", sizeof(array), sizeof(array[0]));
}
4

3 に答える 3

4

ここでの問題は、配列である関数の引数がコンパイラによってポインターに変換されることです。つまり、関数に署名があるかのようです

void function(int *array);

これは、次の 2 つのことを意味します。

  1. 「失われた」ため、配列のサイズを別のパラメーターとして明示的に渡す必要があります。
  2. sizeof(array)アーキテクチャ内のポインターのサイズのみを教えてくれます。したがって、出力から、64 ビット ターゲット用にコンパイルしていることがわかりますが、それ以外には何もありません。

sizeof(array[0])これは (ポインター演算) と同等sizeof(*array)であるため、何があっても正しい値が得られることに注意してください。

于 2013-02-23T22:00:18.933 に答える
1

関数内の sizeof は、システムに応じて 4 または 8 の sizeof ポインターを配列に返します。

于 2013-02-23T21:59:38.353 に答える
1

配列を I/P 引数として関数に渡すと、そのベース アドレスを含むポインターとして扱われます。

あなたが得ている:sizeof(ポインタ)/ sizeof(配列の最初の要素)

GDB の場合: (function() 内)

(gdb) pt matrix_transposition_key                                                               
type = int *                                                                                    
(gdb) pt matrix_transposition_key[0]                                                 
type = int 

(gdb) p sizeof(matrix_transposition_key)
$2 = 8                                                                                          
(gdb) p sizeof(matrix_transposition_key[0])                                                       
$3 = 4                                                                                          
于 2013-02-23T22:01:46.587 に答える