문제

C에서 배열의 크기를 어떻게 결정합니까?

즉, 배열이 보유할 수 있는 요소 수는 얼마입니까?

도움이 되었습니까?

해결책

요약:

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) 또한.

따라서 선호하는 제수는 다음과 같습니다. sizeof(a[0]), 크기 배열의 zeroeth 요소입니다.

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

또 다른 장점은 이제 쉽게 매개 변수를 지정할 수 있다는 것입니다. 매크로의 배열 이름과 get:

#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));

"트릭"의 크기는 내가 아는 가장 좋은 방법입니다. 괄호 사용에 있어서 작지만 (나에게는 이것이 매우 안타까운 일입니다) 중요한 변화가 있습니다.

Wikipedia 항목에서 명확하게 알 수 있듯이 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 포인터 유형으로 끝나고 전체 매크로가 무효화됩니다(포인터 매개변수가 있는 함수에서 매크로를 사용하려고 시도한 것처럼).

결국, 이 안에 특정한 예를 들어, 잘못은 그다지 중요하지 않습니다(그래서 저는 단지 모든 사람의 시간을 낭비하고 있는 것뿐입니다.만세!), '배열' 유형의 표현식이 없기 때문입니다.하지만 실제로 전처리기 평가 세부 사항에 대한 요점은 중요하다고 생각합니다.

을 위한 다차원 배열 조금 더 복잡합니다.종종 사람들은 명시적인 매크로 상수를 정의합니다.

#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",        " " },
};

그러나 이러한 상수는 다음을 사용하여 컴파일 타임에도 평가할 수 있습니다. 크기:

#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++에서 작동합니다.2차원보다 큰 배열의 경우 다음을 사용하세요.

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 '네이티브' 배열은 크기를 저장하지 않습니다.따라서 배열의 길이를 별도의 변수/const에 저장하고 배열을 전달할 때마다 전달하는 것이 좋습니다. 즉, 다음과 같습니다.

#define MY_ARRAY_LENGTH   15
int myArray[MY_ARRAY_LENGTH];

항상 기본 배열을 피해야 합니다(할 수 없는 경우는 제외).C++를 작성하는 경우 다음을 사용하십시오. STL의 '벡터' 컨테이너입니다."어레이와 비교하면 거의 동일한 성능을 제공하며" 훨씬 더 유용합니다!

// 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)는 항상 1입니다.바이트의 비트 수는 구현에 따라 다릅니다.

편집하다:ANSI C++ 표준 섹션 5.3.3 크기:

sizeof 연산자는 피연산자의 객체 표현에서 바이트 수를 산출합니다.[...] sizeof(char), sizeof(signed char) 및 sizeof(unsigned char)는 1입니다.다른 기본 유형에 적용된 sizeof의 결과는 구현에 따라 정의됩니다.

섹션 1.6 C++ 메모리 모델:

C++ 메모리 모델의 기본 저장 단위는 바이트입니다.바이트는 기본 실행 문자 집합의 모든 구성원을 포함할 수 있을 만큼 충분히 크며 연속적인 비트 시퀀스로 구성되며 그 수는 구현에 따라 정의됩니다.

@스키즈:제가 옳다고 확신합니다. 현재 제가 드릴 수 있는 가장 좋은 "소스"는 Wikipedia입니다. sizeof에 대한 기사는 다음과 같습니다.

Wikipedia는 틀렸고 Skizz는 옳습니다.sizeof(char)는 정의에 따라 1입니다.

내 말은, Wikipedia 항목을 자세히 읽어보세요. 그것이 틀렸다는 것을 확인하기 위해."문자의 배수". 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