In diesem Code:
char* realtor_command[120];
for(int i=0;i<REALTOR_MAX_COMMAND_LENGTH;i++){
realtor_command[i]=malloc(sizeof(120));
}
Sie ein Array von 120 Strings erstellen, dann Schleife durch REALTOR_MAX_COMMAND
Strings (vermutlich dies sollte 120?) sein und sie auf neu zugewiesene 4- oder 8-Byte-Strings setzen (sizeof(120)
bedeutet sizeof(int)
, was entweder 4 oder 8 Bytes ist). Da diese Zeichenfolgen neu zugewiesen werden, enthalten sie beliebige Daten und enden möglicherweise nicht mit einem Nullabschlusszeichen.
Dies ist wichtig, weil strlen()
nur eine Schleife über die Zeichenfolge bis zum Auffinden eines Null-Terminators, so dass es nicht mit nicht-nullterminierten Zeichenfolgen arbeiten kann.
Sie könnten einen Null-Terminator selbst hinzufügen, aber dann enthalten die Strings beliebigen Müll bis zum Ende der Zeichenfolge, und sie können Null-Terminatoren in ihnen haben. Man könnte sie mit einem Null-Terminator machen beginnen, aber dann würde strlen()
immer wieder zurückkehren 0.
Was könnte besser sein, diese Strings zuzuweisen ist, wenn man sie tatsächlich füllen, und lassen Sie sie als Null-Zeiger bis dahin:
char* realtor_command[120];
for (int i = 0; i < 120; i++) {
realtor_command[i] = NULL;
}
char input_buffer[REALTOR_MAX_COMMAND];
// Read in one string, then copy it so we can re-use the buffer
fgets(input_buffer, REALTOR_MAX_COMMAND, stdin);
realtor_command[0] = strdup(input_buffer);
Dies wird auch den Speicherverlust in Ihrem Code vermeiden.
Beachten Sie, dass Sie wahrscheinlich die Zeichenfolge gelesen von fgets
enthält eine neue Zeile sicherstellen möchten, unbedingt die Eingabe passen in Puffer zu machen:
if (strstr(input_buffer, "\n") == NULL) {
// error, input didn't fit in our buffer!
}
Zeigen Sie, wie Sie rufen 'strlen', bitte, zusammen mit dem falschen Wert. – Downvoter
Was zum Teufel ist 'sizeof (120)' ?? Sie reservieren _much weniger_ Speicher als 120 Bytes. – ForceBru
Das wäre sizeof (int), entweder 4 oder 8. –