Насколько велик мой массив? - PullRequest
0 голосов
/ 07 сентября 2011

Итак, учитывая следующее:

#include <stdio.h>
int * getarr();
int main(int argc, char* argv)
{
    int * arr = getarr();
    printf("%d", sizeof(arr));
}

int* getarr()
{
    static int a[4] = {0,1,0,3};
    return a;
}

Как найти длину arr?arr[4] == 0, но так же arr[0] и arr[2].

Если бы это было char*, ответ был бы iterate until '\0', но, похоже, здесь не работает как '\0' == 0.

Адресация arr[5] может привести к значению> 16 3 - 1 (размер целого в моей системе), но это не является надежной меройи мне кажется, что это просто пустое место в памяти.

Есть ли способ получить это значение последовательно?Или это просто нужно передать?

Ответы [ 5 ]

4 голосов
/ 07 сентября 2011

Вы не можете получить длину массива, когда находитесь в функции main(). Эта информация была потеряна, когда int[4] был преобразован в int *, возвращенный getarr()

3 голосов
/ 07 сентября 2011

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

Это одна из причин, по которой люди используют языки более высокого уровня, которые содержат более мощные структуры данных, например, std::vector<T>.

2 голосов
/ 07 сентября 2011

Вы не можете найти длину этого массива, кроме явной передачи размера с ним.

1 голос
/ 07 сентября 2011

Массивы C - это просто строки байтов в памяти ... они не похожи на строки Pascal или другие "массивные" структуры данных в таких языках, как Java, Python и т. Д., Которые имеют проверку границ во время выполнения, и поэтому пара информации о размере массива с фактическими данными массива. Поэтому вам нужно будет передать размер массива, чтобы узнать, насколько он велик, если только он не был распределен статически или в кадре локального стека, и в этот момент вы можете использовать sizeof(array).

0 голосов
/ 07 сентября 2011

Нет способа узнать в C. Массив AC - это просто указатель на память, поэтому он имеет тот же размер, что и базовый тип указателя.

Таким образом, вы должны хранить длину где-то еще, напримерв константе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...