2016-04-14 18 views
-1

Ich habe ein seltsames Problem mit der dynamischen Speicherzuweisung. Immer wenn ich ein Mitglied einer Struktur mit nur einem int dynamisch zuordne, kann ich uns viele schreiben, die ich wollte, anstatt nur eine int wie eine normale Variable nicht ein Array. Dies ist mein Code mit einigen Kommentaren und vielleicht können Sie sagen, was ich falsch mache oder was ich Punkt übersprungen:C dynamische Member-Struktur

#include <stdio.h> 
#include <stdlib.h> 

typedef struct{ 
    int *sign_h; 
    int max_chars; 
} myformat; 

int main() 
{ 
    myformat *myfile=malloc(sizeof(myformat)); // one struct 
    myfile->max_chars=100; 
    myfile->sign_h=malloc(1*sizeof(int)); //size of one int 
    myfile->sign_h[333]=50; //Is this suppose to work? 
    printf("test %d",myfile->sign_h[333]); // printf print value of 50 
    FILE* f1=NULL; 
    char nume[]="myfile.bin"; 
    f1=fopen(nume,"wb"); 
    fwrite(&myfile,sizeof(myformat),1,f1); 
    fclose(f1); 
    return 0; 
} 

PS: Und was ist C++? wenn ich es in C++ mache, bekomme ich unterschiedliche Ergebnisse?

+5

Herzlichen Glückwunsch, Sie haben einen Pufferüberlauf entdeckt –

+0

Undefiniertes Verhalten ist nicht definiert. – EOF

+2

Die Sprache hält Sie nicht davon ab, sich in den Fuß zu schießen, also liegt es in Ihrer Verantwortung, dies zu vermeiden. – jamesdlin

Antwort

3

C ist es egal, wenn Sie das Ende eines Arrays abschreiben, es folgen nur Bestellungen. Wenn rufen Sie

myfile->sign_h[333]=50; //Is this suppose to work? 

Was sind Sie wirklich tun sagen: „50 zu den 4 Bytes schreiben, die 333 * sizeof(int) Bytes nach dem Standort von sign_h im Speicher befinden. C sagt:‚OK‘getan, und zwar unabhängig von der . Folgen

Apropos Folgen, könnte es viele negative sein, dass zu tun, einschließlich:

  1. Wenn Sie einen anderen Aufruf von malloc machen, könnte es Sie wieder einen Speicherblock geben, enthält, wo man einfach schrieb in Erinnerung, wenn das der Fall ist, könnten Sie den Wert überlagern du hast gerade geschrieben. Wenn Sie zuvor einen Anruf bei malloc getätigt haben, könnte dies ebenfalls passieren.
  2. Sie könnten segfault. Malloc hat seine eigenen Datenstrukturen unter der Haube, um Informationen über Speicherblöcke zu erhalten, die dem Benutzer zugewiesen sind. Wenn Sie in einen zufälligen, willkürlichen Raum schreiben, könnten Sie die Datenstrukturen von malloc beschädigen.

Verwenden Sie grundsätzlich keinen Speicher, den Sie nicht angefordert haben.