найти размер массива символов C ++ - PullRequest
5 голосов
/ 25 ноября 2011

Я пытаюсь получить переменную sizeof char в другой функции, в которой она была инициализирована, но не могу получить правильный sizeof.пожалуйста, смотрите код ниже

int foo(uint8 *buffer){
cout <<"sizeof: "<< sizeof(buffer) <<endl;
}
int main()
{
uint8 txbuffer[13]={0};
uint8 uibuffer[4] = "abc";
uint8 rxbuffer[4] = "def";
uint8 l[2]="g";
int index = 1;

foo(txbuffer);
cout <<"sizeof after foo(): " <<sizeof(txbuffer) <<endl;
return 0;
}

вывод:

sizeof: 4
sizeof after foo(): 13

желаемый вывод:

sizeof: 13
sizeof after foo(): 13

Ответы [ 3 ]

15 голосов
/ 25 ноября 2011

Этого нельзя сделать только с помощью указателей. Указатели не содержат информации о размере массива - они являются только адресом памяти. Поскольку массивы распадаются на указатели при передаче в функцию, вы теряете размер массива.

Однако можно использовать шаблоны:

template <typename T, size_t N>
size_t foo(const T (&buffer)[N])
{
    cout << "size: " << N << endl;
    return N;
}

Затем вы можете вызвать функцию следующим образом (как и любую другую функцию):

int main()
{
    char a[42];
    int b[100];
    short c[77];

    foo(a);
    foo(b);
    foo(c);
}

Выход:

size: 42
size: 100
size: 77
5 голосов
/ 25 ноября 2011

Ты не можешь.В foo вы запрашиваете размер указателя uint8_t.Передайте размер в качестве отдельного параметра, если он вам нужен в foo.

1 голос
/ 25 ноября 2011

Некоторая магия шаблона:

template<typename T, size_t size>
size_t getSize(T (& const)[ size ])
{
    std::cout << "Size: " << size << "\n";
    return size;
}
...