質問

どんなサイズを決定するの配列。

それらの要素の配列できますか?

役に立ちましたか?

解決

要旨:

int a[17];
size_t n = sizeof(a)/sizeof(a[0]);

フル答え:

を決定するサイズの配列のバイト単位で利用できます sizeof オペレーター:

int a[17];
size_t n = sizeof(a);

コンピュータに入力し、int値を4バイト長で、nは68.

数を決定する配列の要素までも分割が可能 の合計サイズ配列のサイズ配列の要素となります。なにができるこの型のようになります:

int a[17];
size_t n = sizeof(a) / sizeof(int);

の適切な回答(68/4=17)、そのタイプの a 変更しい醜バ忘れの場合は変更 の sizeof(int) しています。

では、優先divisorが sizeof(a[0]), イズ zeroeth要素の配列になります。

int a[17];
size_t n = sizeof(a) / sizeof(a[0]);

もう一つの利点があることができるのを容易にparameterize 配列の名前のマクロおよび取得す:

#define NELEMS(x)  (sizeof(x) / sizeof((x)[0]))

int a[17];
size_t n = NELEMS(a);

他のヒント

sizeof のではあり方を iff お持ちの配列を受信しないパラメータとして配列を送信パラメータとしての機能としてポインタで、 sizeof 戻り、ポインタのサイズの配列。

このように、関数の内部でこのメソッドは動作しません。その代わり、すでにご存じの通りに追加パラメータ size_t size を示す数要素の配列になります。

試験:

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

void printSizeOf(int intArray[]);
void printLength(int intArray[]);

int main(int argc, char* argv[])
{
    int array[] = { 0, 1, 2, 3, 4, 5, 6 };

    printf("sizeof of array: %d\n", (int) sizeof(array));
    printSizeOf(array);

    printf("Length of array: %d\n", (int)( sizeof(array) / sizeof(array[0]) ));
    printLength(array);
}

void printSizeOf(int intArray[])
{
    printf("sizeof of parameter: %d\n", (int) sizeof(intArray));
}

void printLength(int intArray[])
{
    printf("Length of parameter: %d\n", (int)( sizeof(intArray) / sizeof(intArray[0]) ));
}

出力(64ビットのLinux OS)

sizeof of array: 28
sizeof of parameter: 8
Length of array: 7
Length of parameter: 2

出力(32ビットwindows®OS):

sizeof of array: 28
sizeof of parameter: 4
Length of array: 7
Length of parameter: 1

ることから、 sizeof はならない時の対応配列を値として減衰へのポインタ:でもポイントの動きをタイムリーかつ配列のコンパイラと同じであるポインタを単一要素の配列になります。ポインタな"記憶"何の配列を使用した初期化します。

int a[10];
int* p = a;

assert(sizeof(a) / sizeof(a[0]) == 10);
assert(sizeof(p) == sizeof(int*));
assert(sizeof(*p) == sizeof(int));

のsizeof"trick"のか、ひとつの小さながっており、この分野の専門家のペットレ)重要な変動の括弧.

としての文を引用される場合は、出典が"入力が明確に示すように、Cの sizeof 機能ではありません;で オペレーター.このように、必要がありませんので括弧周辺の引数の場合は、引数には、型の名前です。これはすでに引数のようにキャストの表現にも使用括弧.

い:場合は以下:

int myArray[10];

きの要素数ようなコードです:

size_t n = sizeof myArray / sizeof *myArray;

その労働者とコルホーズの女性像とオを読み込みやの代替と括弧.また利用スタリスク右の部門でより簡潔により割り出し.

もちろん、これらはすべてコンパイル時のものではありませんの心配の部門に影響を及ぼす性能のプログラム。ものを使うこともできます。

いつでも使用sizeof実際のオブジェクトがよいではなくタイプ、そんな心配をする必要が作エラーに述べられるように間違ったタイプです。

例えば、言いを出力する機能の一部としてデータバイトのストリームを、インスタンスを渡します。ましょう電話の機能 send(), での取引数としてのポインタをオブジェクトへのお送りのバイト数のオブジェクトです。なので、試作につなが

void send(const void *object, size_t size);

しを送る必要がありますの整数、コードでこのように:

int foo = 4711;
send(&foo, sizeof (int));

今まで紹介しながら、微妙な撮り方が自分の足の指の種類 foo 二カ所にある。場合に変化がないと、コードブレイクがあります。このように、いようになります:

send(&foo, sizeof foo);

かれています保護されている。く、複製変数の名前ですが、それで発生する蓋然性が極めて高い破断方法をコンパイラを検出できた場合、変更します。

int size = (&arr)[1] - arr;

チェック このリンク 説明

利用できるsizeofオペレーターが動作しない機能を致しますので、参考のポインタ 次の操作が可能ですの長さの配列:

len = sizeof(arr)/sizeof(arr[0])

コードただけ早く送ってくださCプログラムの要素数配列

がわかっている場合は、それをデータ型の配列に利用できるようなもの:

int arr[] = {23, 12, 423, 43, 21, 43, 65, 76, 22};

int noofele = sizeof(arr)/sizeof(int);

やれば良いのではないかと思いデータ型の配列に利用できるようなもの:

noofele = sizeof(arr)/sizeof(arr[0]);

注意:この仕様は、場合によっては配列が定義されていない実行時(mallocの配列を渡される機能です。両方の場合、 arr (配列名)のポインタです。

マクロ ARRAYELEMENTCOUNT(x) 皆様が利用を評価し .この、現実的にはただ感受性物質でできない表現する'列'タイプです。

/* Compile as: CL /P "macro.c" */
# define ARRAYELEMENTCOUNT(x) (sizeof (x) / sizeof (x[0]))

ARRAYELEMENTCOUNT(p + 1);

実際に 評価として

(sizeof (p + 1) / sizeof (p + 1[0]));

/* Compile as: CL /P "macro.c" */
# define ARRAYELEMENTCOUNT(x) (sizeof (x) / sizeof (x)[0])

ARRAYELEMENTCOUNT(p + 1);

で正しく評価:

(sizeof (p + 1) / sizeof (p + 1)[0]);

この本当にいいサイズの配列を明確にした。いただきました、知多くの誤りからい見どのようにCプリプロセッサです。まずはマクロパラメータではなく、表現に関与していると考えられますが。


これが正しい私たると述べています。ですが実際に何をすべきと思う。先ほども触れた通り p + 1 している図表等や、他のポインタ型を無効とし、全体のマクロのような場合と利用のマクロ機能、ポインタのパラメータで指定)になります。

の末日は、この 特に インスタンスは、断層ない物だけを無駄に皆さんの時間huzzah!), かん表現型の配列'.だがしかし、ポイントプリプロセッサの評価subtlesと思うのは大事です。

のための 多次元配列 ではtadが複雑化してきております。汎用的に使用しなければ人々の定義明示的なマクロ定数は、

#define g_rgDialogRows   2
#define g_rgDialogCols   7

static char const* g_rgDialog[g_rgDialogRows][g_rgDialogCols] =
{
    { " ",  " ",    " ",    " 494", " 210", " Generic Sample Dialog", " " },
    { " 1", " 330", " 174", " 88",  " ",    " OK",        " " },
};

これらの定数を評価することができコンパイル時にもと sizeof:

#define rows_of_array(name)       \
    (sizeof(name   ) / sizeof(name[0][0]) / columns_of_array(name))
#define columns_of_array(name)    \
    (sizeof(name[0]) / sizeof(name[0][0]))

static char* g_rgDialog[][7] = { /* ... */ };

assert(   rows_of_array(g_rgDialog) == 2);
assert(columns_of_array(g_rgDialog) == 7);

このコードで、CとC++.配列については、寸法の利用

sizeof(name[0][0][0])
sizeof(name[0][0][0][0])

等 なります。

サイズ配列のC:

int a[10];
size_t size_of_array = sizeof(a);      // Size of array a
int n = sizeof (a) / sizeof (a[0]);    // Number of elements in array a
size_t size_of_element = sizeof(a[0]); // Size of each element in array a                                          
                                       // Size of each element = size of type
sizeof(array) / sizeof(array[0])
#define SIZE_OF_ARRAY(_array) (sizeof(_array) / sizeof(_array[0]))

"まっ導入した微妙な撮り方が自分の足"

C種の配列に保管しないそのサイズです。がありますので、念のために保存配列の長さは別の変数/定数、パスしている場合をお渡ししますので配列であることが

#define MY_ARRAY_LENGTH   15
int myArray[MY_ARRAY_LENGTH];

まずは避けネイティブ配列でない場合は、足).を書いていて、C++で使用の STL"s"ベクトル容器です。"に比べてアレイに提供するというほぼ同等な性能"、これはより一層際立ちます。

// vector is a template, the <int> means it is a vector of ints
vector<int> numbers;  

// push_back() puts a new value at the end (or back) of the vector
for (int i = 0; i < 10; i++)
    numbers.push_back(i);

// Determine the size of the array
cout << numbers.size();

参照:http://www.cplusplus.com/reference/stl/vector/

@マグナス:の基準を定義しsizeofとして収量のバイト数のオブジェクトとsizeof(char)として度々取り上げられている.のビット数バイトは、実装固有のものです。

編集:ANSI C++の標準部5.3.3Sizeof:

のsizeofオペレーターの収穫量のバイト数のオブジェクト表現のオペランド.[...]sizeof(char),sizeof(signed char)sizeof(unsigned char)1;の結果sizeof用その他の基礎式は、実装で定義されています。

部1.6のC++のメモリモデル:

基本的な保管ユニットのC++のメモリモデルでは、バイトです。バイト以上)を格納するのに十分な大きさが他の基本的な実行文字セットとは連続したビットの数は実装で定義されています。

@Skizz:っam権は、最高の"源泉"をあげたいと思い、Wikipediaの記事sizeof:

Wikipediaが間違っているのは、Skizzについてはその通りである。sizeof(char)が1より定義で設定します。

だって、 読取るだけではWikipediaに参入も密接に しているのを見るのが間違っている。"複数のchar". sizeof(char) ができるものではないもの その他 以上は"1"また、2つのこと sizeof(char) 二倍のサイズのchar!

なので、しばらく日本にいたい本格的に配列から実施体制のポインタを格納するタイプのた配列の整数を表すサイズの配列になります。それを渡すことができることをおす。で割り当てに配列変数の値ポインタを最初の要素)にポインタです。したいと考えています Array.arr[i] のi番目の要素と利用 Array.size の要素数の配列になります。

また一部のコードです。寒暖の差が激しいので皆様も有用なものまで延長することが特徴です。正直が、これらのものはんだを使用C-使用-他の言語にこれらの機能を内蔵しています。

/* Absolutely no one should use this...
   By the time you're done implementing it you'll wish you just passed around
   an array and size to your functions */
/* This is a static implementation. You can get a dynamic implementation and 
   cut out the array in main by using the stdlib memory allocation methods,
   but it will work much slower since it will store your array on the heap */

#include <stdio.h>
#include <string.h>
/*
#include "MyTypeArray.h"
*/
/* MyTypeArray.h 
#ifndef MYTYPE_ARRAY
#define MYTYPE_ARRAY
*/
typedef struct MyType
{
   int age;
   char name[20];
} MyType;
typedef struct MyTypeArray
{
   int size;
   MyType *arr;
} MyTypeArray;

MyType new_MyType(int age, char *name);
MyTypeArray newMyTypeArray(int size, MyType *first);
/*
#endif
End MyTypeArray.h */

/* MyTypeArray.c */
MyType new_MyType(int age, char *name)
{
   MyType d;
   d.age = age;
   strcpy(d.name, name);
   return d;
}

MyTypeArray new_MyTypeArray(int size, MyType *first)
{
   MyTypeArray d;
   d.size = size;
   d.arr = first;
   return d;
}
/* End MyTypeArray.c */


void print_MyType_names(MyTypeArray d)
{
   int i;
   for (i = 0; i < d.size; i++)
   {
      printf("Name: %s, Age: %d\n", d.arr[i].name, d.arr[i].age);
   }
}

int main()
{
   /* First create an array on the stack to store our elements in.
      Note we could create an empty array with a size instead and
      set the elements later. */
   MyType arr[] = {new_MyType(10, "Sam"), new_MyType(3, "Baxter")};
   /* Now create a "MyTypeArray" which will use the array we just
      created internally. Really it will just store the value of the pointer
      "arr". Here we are manually setting the size. You can use the sizeof
      trick here instead if you're sure it will work with your compiler. */
   MyTypeArray array = new_MyTypeArray(2, arr);
   /* MyTypeArray array = new_MyTypeArray(sizeof(arr)/sizeof(arr[0]), arr); */
   print_MyType_names(array);
   return 0;
}

するのが最善だと思いますを保存しこれらの情報は、例えば、構造:

typedef struct {
     int *array;
     int elements;
} list_s;

を実施すべての必要な機能などを、破壊、チェック等もあります。でもやりとして、パラメータとします。

の機能 sizeof バイト数を返します利用する配列にメモリの内容を消去します。したい場合は計算に要素数配列、分割する数は、 sizeof 変数の型の配列になります。ということか int array[10];, 場合、変数の型整数型コンピューターには32ビット(4バイト)を取得するためのサイズの配列にするべきなの

int array[10];
int sizeOfArray = sizeof(array)/sizeof(int);

で利用できます & オペレーターこちらのソースコード:

#include<stdio.h>
#include<stdlib.h>
int main(){

    int a[10];

    int *p; 

    printf("%p\n", (void *)a); 
    printf("%p\n", (void *)(&a+1));
    printf("---- diff----\n");
    printf("%zu\n", sizeof(a[0]));
    printf("The size of array a is %zu\n", ((char *)(&a+1)-(char *)a)/(sizeof(a[0])));


    return 0;
};

こちらはサンプル出力

1549216672
1549216712
---- diff----
4
The size of array a is 10
int a[10];
int size = (*(&a+1)-a) ;

詳しく見る こちらの とも こちらの.

#include <stdio.h>

int main() {
    int size;
    scanf("%d", &size);
    int array[size];
    printf("%d\n", (int) (sizeof(array) / sizeof(int)));
    printf("%d\n", (int) (sizeof(array) / sizeof(array[0])));
    return 0;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top