Как рассчитать размер массива из переменной указателя? - PullRequest
2 голосов
/ 22 февраля 2012

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

Спасибо.

Ответы [ 3 ]

11 голосов
/ 22 февраля 2012

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

void my_function(int array[], int size);
5 голосов
/ 22 февраля 2012

Вы не можете сделать это в C. Размер указателя равен размеру указателя, а не размеру любого массива, на который может указывать.

Если вы в конечном итогес указателем, указывающим на массив (либо явно с чем-то вроде 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-байтовый указательв вызове функции.

0 голосов
/ 22 февраля 2012

Нет.массивы в C не имеют этой информации.вы должны держать переменную «рядом» с массивом с этими данными.

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