Tôi biết rằng các tiêu chuẩn C cho phép triển khai nơiBất động thực hiện nơi sizeof (size_t) <sizeof (unsigned int)
(sizeof(unsigned) > sizeof(size_t))
hoặc
(sizeof(int) > sizeof(ptrdiff_t))
là đúng. Nhưng có bất kỳ triển khai thực sự nào trong đó một trong những điều này là đúng không?
nền
Tôi đã viết một chức năng tương tự như asprintf()
(kể từ asprintf()
không phải là xách tay), và snprintf()
trả về một int
nhưng cần một đối số size_t
, vì vậy tôi nên kiểm tra nếu leni
(hình dưới đây) không phải là ít hơn SIZE_MAX
trong mã này?
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)
Tôi không chắc chắn điều đó thực sự có thể xảy ra, nếu không 'sizeof (char [LARGE_NUMBER])' sẽ không hoạt động. –
@OliverCharlesworth Nó không allways làm việc, nếu bạn viết một cái gì đó như char str [1024ULL * 1024ULL * 1024ULL * 5] ;, bạn sẽ nhận được một lỗi biên dịch trên máy 32bit (ít nhất là trong trường hợp của tôi với gcc -m32) (nhưng không trên AMD64) – 12431234123412341234123
@OliverCharlesworth Nó không phải. Nếu biểu thức hằng số trong dấu ngoặc đơn làm cho một đối tượng không thể được biểu diễn bởi size_t, đó sẽ là kết quả của sizeof, thì trình biên dịch sẽ tạo ra một lỗi. – 2501