wiem, że średnia C pozwala na implementacje gdzierzeczywistym realizacja gdzie sizeof (size_t) <sizeof (unsigned int)
(sizeof(unsigned) > sizeof(size_t))
lub
(sizeof(int) > sizeof(ptrdiff_t))
jest prawdą. Ale czy są jakieś prawdziwe implementacje, w których jedna z nich jest prawdziwa?
Tło
napisałem funkcję podobną do asprintf()
(od asprintf()
nie jest przenośny), a snprintf()
zwrócić int
ale potrzebuje size_t
argumentu, więc należy sprawdzić, czy leni
(poniżej) jest nie mniejsza niż SIZE_MAX
w tym kodzie?
va_copy(atmp,args)
int leni = vsnprintf(NULL,0,format,atmp); //get the size of the new string
va_end(atmp);
if(leni<0)
//do some error handling
if(leni>=SIZE_MAX) //do i need this part?
//error handling
size_t lens = ((size_t)leni)+1;
char *newString = malloc(lens);
if(!newString)
//do some error hanling
vsnprintf(newString,lens,format,args)!=lens-1)
Nie jestem pewien, czy to rzeczywiście możliwe, w przeciwnym razie 'sizeof (char [LARGE_NUMBER])' nie zawsze będzie działać. –
@OliverCharlesworth Nie zawsze działa, jeśli napiszesz coś w stylu char str [1024ULL * 1024ULL * 1024ULL * 5]; otrzymasz błąd kompilacji na komputerach 32-bitowych (przynajmniej w moim przypadku z gcc -m32) (ale nie na AMD64) – 12431234123412341234123
@OliverCharlesworth To nie musi. Jeśli wyrażenie stałe w nawiasach tworzy obiekt, który nie może być reprezentowany przez size_t, który będzie wynikiem sizeof, wówczas kompilator wygeneruje błąd. – 2501