Quelle est la limite sur malloc paramètre de type size_t en C? Docs disent que c'est une limite de UINT_MAX mais je ne peux pas aller au-delà de INT_MAX
Je veux allouer un 2.9 GO char tableau avec
database = (char*) malloc((2900 * 1000000 * sizeof(char)));
Cela donne un débordement d'entier avertissement et le malloc
retourne NULL
. L'
malloc
paramètre est de type size_t
qui, selon la documentation est de type
unsigned int
.
Donc le max doit être UINT_MAX
qui est au moins de 2.9 GO. Toutefois, si
J'essaie d'allouer plus de MAX_INT
la malloc
échoue. Est-ce à dire
size_t
sur mon système est de type int? Comment puis-je le vérifier? J'ai regardé à travers
/usr/include/stdlib.h
et
./lib/gcc/x86_64-redhat-linux/4.1.1/include/stddef.h
mais
ne pouvez pas trouver la définition de size_t
. Merci beaucoup
Cela signifie que vous n'avez pas assez de RAM 🙂
J'ai oublié de mentionner que j'ai 12 go de RAM sur l'ordinateur.
Vous avez aussi oublié de mentionner que votre système est en 32 bits.
J'ai oublié de mentionner que j'ai 12 go de RAM sur l'ordinateur.
Vous avez aussi oublié de mentionner que votre système est en 32 bits.
OriginalL'auteur Roshan | 2012-03-02
Vous devez vous connecter pour publier un commentaire.
Il y a deux problèmes ici.
Tout d'abord, le dépassement avertissement: les deux
2900
et1000000
sont de typeint
, de sorte que le résultat de la multiplication est également de typeint
. Le résultat ne peut pas être représenté par un entier signé 32 bits, de sorte qu'il déborde. Vous avez besoin de jeter un (ou les deux) des arguments àsize_t
à utiliser unsigned arithmétique.(Ou, vous pouvez déplacer la
sizeof(char)
pour être l'un des deux premiers termes, depuis son type estsize_t
, mais vous pouvez aussi tout simplement supprimer lesizeof(char)
, car il est toujours1
.)Deuxième, la taille maximale que
malloc
peut allouer dépend à la fois sur la plate-forme sur laquelle vous êtes en cours d'exécution et sur l'état actuel du programme. Si la place est insuffisante contiguë adresse d'espace pour satisfaire la demande, évidemment, lemalloc
échouera.En outre, la plate-forme sur laquelle vous exécutez peut-être une limite supérieure à la taille d'un objet, il peut allouer dynamiquement. Vous aurez besoin de consulter votre plate-forme de documentation pour savoir ce que la limite supérieure est de.
size_t
est certainement pasint
, parce queint
est toujours signé etsize_t
est toujours pas signé.Oui, il devrait être défini dans
<stddef.h>
, ou de certains d'en-tête inclus par<stddef.h>
.Vous feriez mieux d'utiliser
strtoul
, qui retourne ununsigned long
, et permet en fait pour la vérification des erreurs. Unatoi
l'échec est impossible à distinguer d'un succès analyser la valeur zéro.Merci. J'ai supprimé le commentaire précédent, car il ne semble pas approprié de poster une question différente de le fil du sujet. En tout cas, je vous remercie de votre réponse.
Ou vous pourriez postfix votre entiers avec "u"... Voir exemple ici: stackoverflow.com/a/11310482/866618
OriginalL'auteur James McNellis
Le paramètre est de type
size_t
etmalloc
est tenu d'accepter toute valeur possible de typesize_t
. Notez que "accepter" n'a pas signifié qu'il est nécessaire d'allouer beaucoup; tout cela signifie, c'est quemalloc
n'est pas autorisé à mal interpréter un très grand nombre de le donner comme un petit/nombre négatif en raison de problèmes de débordement, ce qui permet de revenir à un tampon est trop petit et la création d'une critique indétectable vulnérabilité votre programme ne peut pas se défendre. Il y a beaucoup de raisons possiblesmalloc
pourrait ne pas allouer de très grands objets:Dans ce cas, je soupçonne que vous pourriez voir la troisième, de limites arbitraires, même si je ne les considère pas comme si arbitraire. Il y a une très bonne raison de refuser les allocations (et de l'existence de tous les objets) plus grand que
SIZE_MAX/2
: différence entre les pointeurs à l'intérieur de ces grands objets de résultat dans le (extrêmement dangereux) de débordement d'entier et un comportement indéfini lorsque le résultat ne correspond pas à l' (signé) typeptrdiff_t
. Ainsi, sur un robuste système 32 bits, tandis que l'espace d'adressage virtuel de la taille est de 4 go, la taille maximale d'un objet unique sera de 2 go.ptrdiff_t
.OriginalL'auteur R..
La taille maximale que malloc peut allouer dépend à la fois sur la plate-forme sur laquelle vous êtes en cours d'exécution et sur l'état actuel du programme. Si la place est insuffisante contiguë adresse d'espace pour satisfaire la demande, le malloc échoue évidemment.
OriginalL'auteur Pallavi Mangate