Как определить размер моего массива в C? - PullRequest
835 голосов
/ 01 сентября 2008

Как определить размер моего массива в C?

То есть количество элементов, которое может содержать массив?

Ответы [ 21 ]

12 голосов
/ 01 сентября 2008
sizeof(array) / sizeof(array[0])
10 голосов
/ 12 сентября 2016
#define SIZE_OF_ARRAY(_array) (sizeof(_array) / sizeof(_array[0]))
9 голосов
/ 15 ноября 2011

«Вы ввели тонкий способ выстрелить себе в ногу»

C 'родные' массивы не сохраняют свой размер. Поэтому рекомендуется сохранять длину массива в отдельной переменной / const и передавать ее всякий раз, когда вы передаете массив, то есть:

#define MY_ARRAY_LENGTH   15
int myArray[MY_ARRAY_LENGTH];

Вы ДОЛЖНЫ всегда избегать нативных массивов (если вы не можете, в таком случае, следите за своей ногой). Если вы пишете на C ++, используйте контейнер STL 'vector'. «По сравнению с массивами они обеспечивают почти одинаковую производительность», и они гораздо полезнее!

// 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/

4 голосов
/ 01 сентября 2008

@ Skizz: Я почти уверен, что я прав, хотя лучший «источник», который я могу вам дать на данный момент, - это Википедия из статьи на sizeof:

Википедия не права, Скизз прав. sizeof (char) равен 1, по определению.

Я имею в виду, просто внимательно прочитайте статью в Википедии , чтобы увидеть, что это неправильно. "кратные чар". sizeof(char) никогда не может быть ничем другим , кроме "1". Если бы это было, скажем, 2, это означало бы, что sizeof(char) был в два раза больше char!

4 голосов
/ 01 сентября 2008

@ Магнус: Стандарт определяет sizeof как число байтов в объекте, а sizeof (char) всегда равен единице. Количество битов в байте зависит от конкретной реализации.

Редактировать: стандартный раздел ANSI C ++ 5.3.3 Размер:

Оператор sizeof возвращает количество байтов в объектном представлении своего операнда. [...] sizeof (char), sizeof (char со знаком) и sizeof (char без знака) равны 1; результат sizeof, примененного к любому другому фундаментальному типу, определяется реализацией.

Раздел 1.6 Модель памяти C ++:

Фундаментальным хранилищем в модели памяти C ++ является байт. Байт, по крайней мере, достаточно большой, чтобы содержать любой элемент основного набора символов выполнения, и состоит из непрерывной последовательности битов, число которых определяется реализацией.

4 голосов
/ 13 июня 2013

Если вы действительно хотите сделать это, чтобы обойти ваш массив, я предлагаю реализовать структуру для хранения указателя на тип, для которого вы хотите массив, и целого числа, представляющего размер массива. Затем вы можете передать это своим функциям. Просто назначьте этому указателю значение переменной массива (указатель на первый элемент). Затем вы можете пойти 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;
}
3 голосов
/ 20 августа 2018

Функция sizeof возвращает количество байтов, которое используется вашим массивом в памяти. Если вы хотите вычислить количество элементов в вашем массиве, вам следует разделить это число на тип переменной sizeof массива. Допустим, int array[10];, если целое число переменной на вашем компьютере 32-битное (или 4 байта), чтобы получить размер вашего массива, вы должны сделать следующее:

int array[10];
int sizeOfArray = sizeof(array)/sizeof(int);
3 голосов
/ 17 февраля 2016

Лучше всего сохранить эту информацию, например, в структуре:

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

Реализуйте все необходимые функции, такие как создание, уничтожение, проверка равенства и все остальное, что вам нужно. Проще передать в качестве параметра.

1 голос
/ 18 июля 2018
int a[10];
int size = (*(&a+1)-a) ;

Подробнее см. здесь а также здесь .

1 голос
/ 03 мая 2013

Вы можете использовать оператор &. Вот исходный код:

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...