2010-09-03 15 views

Odpowiedz

6

Nie, biorąc pod uwagę wskaźnik C, nie można określić jego długości w sposób niezależny od platformy.

Dla rzeczywiste tablica C chociaż zobaczyć dirkgently znajduje answer

+0

Pytanie nie jest bardzo jasne; Zawsze możesz uzyskać długość tablicy, jeśli jej definicja ma zasięg lokalny ;-) – dirkgently

+0

@ amirently, zgadzam się, nie jest jasne, czy pytają o długość wskaźnika lub długość tablicy. Przekierowałem ich do twojej odpowiedzi na tę ostatnią – JaredPar

3

Można dostać go za pomocą makra:

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

wtedy i tylko wtedy, gdy tablica jest automatyczny i masz do niego dostęp w ramach swojej definicji jako:

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

Jednakże, jeśli masz tylko (zepsute) wyżeł nie można uzyskać długość tablicy, bez uciekania się do pewnego zakaz przenośnego realizacji określony hack.

+0

"% z" ?? co masz na myśli? – user411313

+3

* z * _Określa, że ​​następujący specyfikator konwersji d, i, o, u, x lub X ma zastosowanie do 'size_t' lub odpowiedniego argumentu typu ze znakiem; lub że następujący n specyfikacji konwersji dotyczy wskaźnika do typu liczby całkowitej ze znakiem odpowiadającego argumentowi size_t._ – dirkgently

+2

To makro wymaga o wiele więcej nawiasów, aby uniknąć typowych problemów z makrami. –

1

Jeśli używasz MSVC/MinGW jest nieprzenośnej rozwiązanie dla prawdziwego C-pointer:

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

Dla prawdziwego C-Array jak

AnyType myarray[] = {...}; 

lub

AnyType myarray[constVal]; 

zobacz drugą odpowiedź.

+1

nie można założyć, że masz wskaźnik od malloc. – fazo

+1

@fazo, z pewnością możesz założyć, że pochodzi z malloc. To po prostu okropny pomysł :) – JaredPar

Powiązane problemy