C ölçüsü nədir?

Mən size_t ilə qarışdırdım. Bilirəm ki, operatorun sizeof ilə qaytarılır. Amma nədir? Bir məlumat növü mi?

Gəlin loop for bir sözümüz var:

 for(i = 0; i < some_size; i++) 

int i; istifadə etməliyəmmi int i; və ya size_t i; ?

477
31 марта '10 в 8:51 2010-03-31 08:51 Vijay 31 Mart 'da saat 08: 51-də təyin olunub. 2010-03-31 08:51
@ 12 cavab

Vikipediya :

ISO ISO 1999 (C99) 'a əsasən, size_t minimum 16 bit olan imzasız tamsayıdır (bax 7.17 və 7.18.3 bölmələri).

size_t müəyyən edilmiş C99 ISO / IEC 9899, ​​məsələn, bir neçə C / C + + standartı ilə müəyyən edilmiş imzalanmamış məlumat növüdür. 1 stdlib.h daxil olmaqla əlavə olaraq idxal edilə bilər, çünki bu daxili fayl stddef.h daxildir.

Bu cür obyektin ölçüsünü təmsil etmək üçün istifadə olunur. Ölçüləri qəbul edən və ya size_t kitabxana funksiyaları, bir növ olmasını və ya size_t növündən geri dönüş növü olmasını size_t . Bundan əlavə operator operatorunun ölçüsü ən çox istifadə edilən size_t ilə uyğun olan sabit dəyəri qiymətləndirməlidir.

Bir implication olaraq, size_t hər hansı bir sıra indeksini ehtiva edən bir zəmanətdir.

368
31 марта '10 в 8:56 2010-03-31 08:56 Cavab sblom tərəfindən verilir 31 Mart 2010, saat 08:56 2010-03-31 08:56

size_t işarəsi olmayan bir növüdür. Beləliklə, hər hansı mənfi dəyərləri təmsil edə bilməz (<0). Bir şey düşündüyünüz zaman istifadə edirsiniz və bunun mənfi olacağına əminsiniz. Məsələn, strlen() size_t qaytarır, çünki size_t uzunluğu ən azı 0 olmalıdır.

Sizin nümunənizdə, döngə indeksiniz həmişə size_t böyük olsa, size_t və ya başqa bir imzasız veri növü istifadə etmək size_t ola bilər.

size_t obyektini istifadə etdikdə, aritmetik də daxil olmaqla istifadə etdiyi bütün kontekstlərdə qeyri-mənfi dəyərlər istəməyinizə əmin olmalısınız. Məsələn, deyək:

 size_t s1 = strlen(str1); size_t s2 = strlen(str2); 
border=0

str2str1 uzunluqlardakı fərqləri tapmaq str2 . Siz ola bilməz:

 int diff = s2 - s1;  

s2 < s1 olsa belə, s2 < s1 verilən dəyər həmişə müsbət s2 < s1 , çünki hesablama imzalanmamış növlərlə həyata keçirilir. Bu halda, istifadə vəziyyətinizə bağlı olaraq, s1s2 üçün int (və ya long long ) long long istifadə edə bilərsiniz.

C / POSIX-də bəzi funksiyalar size_t , lakin bu, tarixin səbəblərindən deyil, size_t istifadə edə bilər. Məsələn, fgets üçün ikinci parametre fgets olmalıdır, lakin int .

182
31 марта '10 в 12:11 2010-03-31 12:11 31 mart 'da 12:11' da Alok Singhal'a cavab verdi 2010-03-31 12:11

size_t hər hansı bir sıra indeksi ehtiva edən bir növüdür.

Tətbiqdən asılı olaraq bu aşağıdakılardan birinə çevrilə bilər:

unsigned char

unsigned short

unsigned int

unsigned long

unsigned long long

Burada size_t müəyyən edilir:

 typedef unsigned long size_t; 
59
25 февр. Cavab Arjun Sreedharan tərəfindən verilir 25 Fevral. 2014-02-25 21:32 '14 da 21:32 2014-02-25 21:32

Əgər təcrübi bir növü varsa

 echo | gcc -E -xc -include 'stddef.h' - | grep size_t 

Ubuntu 14.04 64-bit GCC üçün çıxış 4.8:

 typedef long unsigned int size_t; 

Qeyd edək ki, stddef.h GCC 4.2-də src/gcc/ginclude/stddef.h altında src/gcc/ginclude/stddef.h deyil, GCC tərəfindən təmin edilir.

Maraqlı çıxışlar C99

  • malloc bir argument olaraq ölçüsü alır, buna görə ayrılan maksimum ölçüsü müəyyən edir.

    Və bu da sizeof qaytarır, çünki, hər hansı bir sıra maksimum ölçüsü məhdudlaşdırmaq düşünürəm.

    Həmçinin baxın: C'de maksimum array ölçüsü

48
15 июня '15 в 0:07 2015-06-15 00:07 Ciro Santilli tərəfindən verilmiş cavab 改造 改造 中心 六四 事件 tövsiyə 15 İyun '15 də 0:07 2015-06-15 00:07

Types.h üçün manpage deyir:

size_t əlamətsiz bir tamsayı olmalıdır

16
31 марта '10 в 8:56 2010-03-31 08:56 Cavab codaddict tərəfindən 31 Mart 2010- cu ildə saat 08 : 56 -da verilmişdir 2010-03-31 08:56

Heç kim bu haqda hələ qeyd size_t , size_t əsas linqvistik dəyəri, operatorun sizeof bu növün dəyərini qaytarır. Eynilə, ptrdiff_t in əsas dəyəri, bir göstəricini başqa birindən çıxarmaq bu cür bir dəyər verməkdir. Bu funksiyanı qəbul edən kütüphanedə funksiyaları belə funksiyaları UINT_MAX-dən daha çox obyektlərlə işləməyə imkan verir, çünki bu cür obyektlərin zəng edənləri "imzasız int" daha geniş bir növü bütün mümkün obyektlər üçün kifayət edəcək sistemlərdə.

11
05 окт. cavab 05 oktyabr yüksək səviyyədə verilir . 2016-10-05 22:46 '16 saat 10:46 'da 2016-10-05 22:46

size_tint birinə size_t . Məsələn, Linux'un 64-bit versiyasında size_t 64 bitlik ölçüyə malikdir (yəni sizeof(void*) ), ancaq int 32- size_t .

Həmçinin, size_t heç bir əlamət yoxdur. Əgər imzalanmış bir versiyaya ehtiyac varsa, bəzi platformalarda ssize_t var və bu sizin nümunəniz üçün daha vacibdir.

Bir qayda olaraq, ən size_t vəziyyətlər üçün int istifadə edərək, yalnız size_t / ssize_t istifadə size_t təklif edərdim (məsələn, mmap() ).

5
30 окт. cavabı 30 dəqə verilir . 2013-10-30 06:03 '13, 6:03 'da 2013-10-30 06:03

Ümumiyyətlə, 0-da başlayan və yuxarı qalxdığınız zaman həmişə daşqından qaçmaq üçün əlamətsiz bir növü istifadə edin, bu da sizi bir mənfi dəyərə gətirib çıxarır. Bu çox vacibdir, çünki serialın sərhədləri maksimum dövrlərinizdən kiçik olsa da, maksimum dövriniz maksimum tipdən daha böyükdürsə, mənfi hiss edirsiniz və bir segmentasiya səhvinə (SIGSEGV) rast gəlmək olar. Buna görə, ümumiyyətlə, heç bir zaman 0-dan başlayan bir döngü üçün int istifadə etmir və qalxır. İmzalamadan istifadə edin.

3
09 нояб. cavab 09 noyabrda verilir. 2013-11-09 20:34 '13 at 20:34 2013-11-09 20:34

İmzalanmamış əsas tam ədədlərdən biri üçün bir alias.

Bu hər hansı bir obyektin ölçüsünü baytlarda təmsil edə bilən bir növüdür: size_t sizeof operator tərəfindən qaytarılan növdür və ölçülü və sayarların göstərilməsi üçün standart kitabxanada geniş istifadə olunur.

0
09 нояб. Cavab 09 noyabr tarixində user2797635 tərəfindən verilmişdir. 2017-11-09 20:03 '17 saat 20:03 'də 2017-11-09 20:03

size_t bir unsigned tamsayı məlumat növüdür. GNU C kütüphanesini istifadə edən sistemlərdə, bu int imzalanmamış və ya imzalanmamış uzun int olacaq. size_t adətən bir sıra dizinlemek və dövrü saymaq üçün istifadə olunur.

0
12 авг. cavab 12 avqust şahzadə verilir . 2017-08-12 08:56 '17 də 8:56 2017-08-12 08:56

size_t və ya hər hansı bir imzalanmamış növü bir loop dəyişən kimi baxıla bilər, çünki loop dəyişənləri adətən 0'dan böyük və ya bərabərdir.

Size_t obyektini istifadə edərkən, aritmetik də daxil olmaqla istifadə etdiyi bütün kontekstlərdə biz yalnız qeyri-mənfi dəyərlər istəyirik. Məsələn, aşağıdakı proqram mütləq gözlənilməz nəticə verəcəkdir:

 // C program to demonstrate that size_t or // any unsigned int type should be used // carefully when used in a loop #include<stdio.h> int main() { const size_t N = 10; int a[N]; // This is fine for (size_t n = 0; n < N; ++n) a[n] = n; // But reverse cycles are tricky for unsigned // types as can lead to infinite loop for (size_t n = N-1; n >= 0; --n) printf("%d ", a[n]); } Output Infinite loop and then segmentation fault 
0
15 мая '18 в 21:10 2018-05-15 21:10 Cavab bishwas pokharel tərəfindən 15 may, 18 saat 9:10 pm 2018-05-15 21:10 tərəfindən verilir

Mənim baxımdan, size_t , bit ölçüsü öz mimarisinin işaretçisini size_t böyük bir unsigned tamsayıdır.

Beləliklə:

 sizeof(size_t) >= sizeof(void*) 
-4
08 марта '13 в 0:48 2013-03-08 00:48 Cavab David Zeicheel tərəfindən 08 Mart 2013, 08:48 'da verilir

tags bağlı digər suallar və ya bir sual