Как рассчитать размер массива из переменной указателя?

у меня есть указатель массива (массив, который находится в памяти). Могу ли я рассчитать размер массива из его указателя? на самом деле я не знаю, где находится массив в памяти. Я только получаю адрес указателя (предположим, 9001), используя этот адрес, я должен рассчитать размер массива.

Благодарю.

 Dietrich Epp22 февр. 2012 г., 09:48
Пожалуйста, пометьте этот вопрос как либо[C] или же[C++] но не оба. На этот вопрос некоторые ответы, применимые к одному языку, не будут применяться к другому.
 webgenius22 февр. 2012 г., 10:08
sizeof (массив) / sizeof (массив [0]) даст вам количество элементов в массиве. Умножьте это на sizeof (array_element_type), и вы получите общий размер, занимаемый массивом.
 Lalaland22 февр. 2012 г., 08:28
Это было бы проще с C ++ шаблонами ...
 Sachin Mhetre22 февр. 2012 г., 12:24
Вы хотите найти максимальный размер или нет. элементов в этом массиве?
 porges22 февр. 2012 г., 08:20
Это должно быть помечено [C #]? Похоже, у вас действительно проблемы с [C].

Ответы на вопрос(3)

вы не можете рассчитать размер массива. Объекты в C не несут информацию о типе, поэтому вы должны заранее определить размер массива. Что-то вроде этого:

void my_function(int array[], int size);
 Dietrich Epp22 февр. 2012 г., 09:45
Чем проще вопрос, тем больше потеря велосипеда.
 Steve Jessop22 февр. 2012 г., 09:42
Лично я бы посоветовал против использованияint array[] в качестве параметра функции. В принципе это может помочь читателям, сказав им, чтоarray указатель на первый из одного или несколькихints. На практике: (1)size уже говорит им это; (2) люди привыкли использоватьchar* при передаче указателя на первый символ строки, а неchar[]чтобы они могли справиться сint* слишком; (3) другой синтаксис часто вводит новичков в заблуждение, заставляя их думать, что это как-то отличается отint *array.
 Steve Jessop22 февр. 2012 г., 09:47
Да, вы, вероятно, правы. Потому что в вопросе, где кто-то смущен / неосведомлен о том, как работают массивы (и указатели на их первые элементы), вещи, которые сбивают людей с толку о том, как работают массивы (и указатели на их первые элементы), тривиальны по сравнению с явной славой вашего правильного ответа ,

рядом» с массивом с этими данными.

если у вас есть сам массив, вы можете использовать sizeof, чтобы получить его размер на этапе компиляции.

char array1[XXX];
char* pointer1 = array1;
sizeof(array1); // this is XXX
sizeof(pointer1); // this is the size of a pointer in your system

Вы должны сделать следующее и использовать переменную в своей программе (или передать ее функции, когда вы передаете массив функции)

int array1size = sizeof(array1);

а не размер любого массивамай указывать на.

Если вы в конечном итоге указатель на массив (либо явно что-то вродеchar *pch = "hello"; или неявно с распадом массива, таким как передача массива в функцию), вам нужно будет хранить информацию о размере отдельно, например:

int twisty[] = [3,1,3,1,5,9];
doSomethingWith (twisty, sizeof(twisty)/sizeof(*twisty));
:
void doSomethingWith (int *passages, size_t sz) { ... }

Следующий код иллюстрирует это:

#include <stdio.h>

static void fn (char plugh[], size_t sz) {
    printf ("sizeof(plugh) = %d, sz = %d\n", sizeof(plugh), sz);
}

int main (void) {
    char xyzzy[] = "Pax is a serious bloke!";
    printf ("sizeof(xyzzy) = %d\n", sizeof(xyzzy));
    fn (xyzzy, sizeof(xyzzy)/sizeof(*xyzzy));
    return 0;
}

Вывод в моей системе:

sizeof(xyzzy) = 24
sizeof(plugh) = 4, sz = 24

потому что 24-байтовый массив преобразуется в 4-байтовый указатель в вызове функции.

 paxdiablo22 февр. 2012 г., 09:00
Хорошее предложение, @liwp, я изменил имена, чтобы устранить путаницу.
 paxdiablo22 февр. 2012 г., 08:56
Нет, в массиве 24 байта"Pax is a serious bloke!", Я подозреваю, что вы перепутали с целочисленным массивом выше этого.
 liwp22 февр. 2012 г., 08:55
не должныsz вfn() быть6?
 liwp22 февр. 2012 г., 08:58
Ой, простите, я думалxyzzy = [3,1,3,1,5,9] из вашего предыдущего примера. Может использовать то же самоеxyzzy значение в обоих примерах?

Ваш ответ на вопрос