2010-09-03 3 views

ответ

6

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

Для фактического массива C, хотя см dirkgently это answer

+0

Вопрос не очень ясен; Вы всегда можете получить длину массива, если его определение локально в области ;-) – dirkgently

+0

@ dirkgently, я согласен, неясно, спрашивают ли они длину указателя или длину массива. Я перенаправил их на ваш ответ для последнего – JaredPar

3

Вы можете получить его с помощью макроса:

#define sizeofa(array) sizeof array/sizeof array[ 0 ] 

тогда и только тогда, когда массив является автоматическим, и вы к нему доступ в сферу его определения как:

#include <stdio.h> 
int main() { 
    int x[] = { 1, 2, 3 }; 
    printf("%zd\n", sizeofa(x)); 
    return 0; 
} 

Однако, если у вас есть только (гнилой) указатель вы не можете получить длину массива, не прибегая к некоторым непортабельному реализации специфический взлом.

+0

«% z» ?? что вы имеете в виду? – user411313

+3

* z * _ Указывает, что следующий спецификатор преобразования d, i, o, u, x или X применяется к аргументу 'size_t' или соответствующему символу со знаком целочисленного типа; или что следующий указатель преобразования n применяется к указателю на целочисленный тип со знаком, соответствующий аргументу size_t. – dirkgently

+2

Этот макрос требует гораздо больше скобок, чтобы избежать общих проблем с макросами. –

1

Если вы используете MSVC/MinGW есть непереносимые решение для реального C-указатель:

#include <malloc.h> 
char *s=malloc(1234); 
#ifdef __int64 
printf("%lu\n", _msize(s)); 
#else 
#endif 

Для реального C-массив как

AnyType myarray[] = {...}; 

или

AnyType myarray[constVal]; 

см. Другой ответ.

+1

вы не можете предположить, что у вас есть указатель от malloc. – fazo

+1

@fazo, вы, конечно, можете предположить, что это от malloc. Это просто ужасная идея :) – JaredPar

Смежные вопросы