Was passiert, wenn wir Malloc mit negativem Parameter aufrufen?

Lesezeit: 3 Minuten

Benutzer-Avatar
Dineshkumar

7.22.3.4 Die malloc-Funktion Die malloc-Funktion weist Platz für ein Objekt zu, dessen Größe durch size angegeben wird und dessen Wert unbestimmt ist.

Prototyp: void *malloc(size_t size);

Ich habe versucht, einen negativen Wert als Parameter zu übergeben: malloc(negative) kehrt zurück NULL.

Liegt es daran, dass [size_t] negativ in vorzeichenlos umgewandelt [some big value] und kann den erforderlichen Speicherplatz nicht zuweisen oder ist die Funktion, die Parameter und Rückgaben überprüft NULL?

Wenn es zu einem großen Plus wird, dann beim Anruf malloc(INT_MIN+2) es kehrt immer noch zurück NULLaber malloc(0) Zeiger und zugeordnet *p = somevalue funktioniert. Was ist damit?

Ist die Umsetzung definiert?

Lesen Sie diesen Link:malloc(0)

  • size_t ist ein vorzeichenloser Typ ssize_t würde unterschrieben.

    – Alexander Ach

    13. Februar 2015 um 14:03 Uhr

EIN size_t value ist immer positiv, auch wenn Sie einen negativen Wert an übergeben malloc. Der negative Wert wird in einen vorzeichenlosen Wert des Typs konvertiert size_t was zu einem enormen positiven Wert führt.

Beispiel:

char *p = malloc(-2);

ist äquivalent zu:

char *p = malloc(SIZE_MAX - 1);  // SIZE_MAX is the maximum
                                 // size_t value 

  • wie Größe bestimmt? auch wenn ich eine mögliche Speichergröße habe? sagen wir mal 8 gb ram? [or memory limited to programs]

    – Dineshkumar

    29. Juli 2013 um 13:49 Uhr

  • @Dineshkumar, wie die Größe in eine Ganzzahl ohne Vorzeichen konvertiert wird, ist implementierungsabhängig, IIRC. Die meisten Architekturen verwenden heutzutage jedoch das Zweierkomplement und die entsprechende Konvertierung. Machen Sie einen Test, indem Sie eine Funktion mit dem gleichen Argumenttyp wie malloc schreiben und sie darin ausgeben. Unter Linux schlägt malloc bei aktiviertem Memory Overcommit grundsätzlich nie fehl, egal was Sie ihm übergeben (vielleicht nur, wenn der Adressraum erschöpft ist). Versuche, in mehr (virtuellen) Speicher zu schreiben, als verfügbar ist, führen jedoch zu SIGSEGV. Bei Windows bin ich mir nicht sicher, aber es ist wahrscheinlich ähnlich.

    – spbnick

    29. Juli 2013 um 13:54 Uhr


  • @spbnick dies ist eigentlich nicht implementierungsdefiniert und wird von regiert (c99, 6.3.1.3p2) “Andernfalls, wenn der neue Typ vorzeichenlos ist, wird der Wert konvertiert, indem wiederholt eins mehr als der maximale Wert, der im neuen Typ dargestellt werden kann, addiert oder subtrahiert wird, bis der Wert im Bereich von liegt neuer Typ”

    – au

    29. Juli 2013 um 13:57 Uhr

  • wenn ich malloc (INT_MIN+offset) übergebe, sollte es zu einem kleinen positiven Wert führen, richtig, es ergibt immer noch NULL?

    – Dineshkumar

    29. Juli 2013 um 14:12 Uhr

  • @Dineshkumar: Nehmen wir beides an int und size_t sind 32 Bit. Wenn INT_MIN == -2147483648 und offset == 100dann INT_MIN + offset == -2147483548die bei der Konvertierung in ein 32-Bit size_t Erträge +2147483748.

    – Keith Thompson

    29. Juli 2013 um 14:43 Uhr

Benutzer-Avatar
Shafik Yaghmur

Da das Argument zu malloc ist vom Typ Größe_t die vorzeichenlos ist, aber Sie übergeben eine vorzeichenbehaftete Ganzzahl, in die der ganzzahlige Wert konvertiert wird Größe_t die Regeln hierfür sind im Entwurf des C99-Standardabschnitts enthalten 6.3.1.3 Ganzzahlen mit und ohne Vorzeichen was darunter fällt Konvertierungen und es heißt:

Andernfalls, wenn der neue Typ vorzeichenlos ist, wird der Wert konvertiert, indem wiederholt eins mehr als der maximale Wert, der im neuen Typ dargestellt werden kann, addiert oder subtrahiert wird, bis der Wert im Bereich des neuen Typs liegt.49)

Schauen wir uns ein Beispiel an, was das bedeutet, wenn Sie vorbeikommen -1 dann wird max size_t Wert + 1 hinzugefügt:

-1 + MAX_SIZE_T + 1

was in … endet:

 MAX_SIZE_T

Zum -5 du würdest enden mit:

MAX_SIZE_T - 4

Das bedeutet, dass bei kleinen negativen Werten der resultierende size_t-Wert eine sehr große positive Zahl ist.

Also warum empfängst du NULL zurück für malloc in diesen Fällen? Gehen wir zurück zum Abschnitt Entwurf des Standards 7.20.3 Speicherverwaltungsfunktionen es sagt:

Wenn der Speicherplatz nicht zugewiesen werden kann, wird ein Nullzeiger zurückgegeben

Sie stellen eine zu große Anfrage und der Platz kann nicht zugewiesen werden.

1245400cookie-checkWas passiert, wenn wir Malloc mit negativem Parameter aufrufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy