2016-06-25 15 views
0

Sprache ist C. Ich habe ein Array von char * -Typen (char * array []/char ** -Array) als Funktionsargument, und ich möchte sie alle auf separate Zeilen wie diese drucken:printf stürzt nach erfolgreichem Drucken ab

Jetzt aus irgendeinem Grund, mit einer bestimmten Eingabe, es verwaltet, um alle Werte zu drucken, aber sofort abstürzt, nachdem das letzte * Array gedruckt wird. Nach dem letzten Druck wird also nicht mehr "nach dem letzten Druck" gedruckt. Leider bin ich auf Windows 7 mit netbeans C Unterstützung, ohne gdb. Es gab einige Probleme, als ich versuchte, es auf Netbeans zu installieren, aber das ist eine andere Geschichte.

Vor allem, was könnte das verursachen? Zweitens, wie könnte ich ohne gdb versuchen, dieses Verhalten am besten zu debuggen? Wenn jemand eine Antwort gibt, die mir hilft, das Problem zu beheben und es zu lösen, werde ich auch davon Punkte gewähren. Einige Hintergrundinformationen bezüglich des Funktionsarguments, das den Absturz verursacht: Ich habe strtok verwendet, um char ** arr aus char * string zu generieren, wobei ein Leerzeichen als Delimeter verwendet wurde.

EDIT:

Mehr Informationen: Wenn ich in der gleichen Funktion versuchen, den letzten * Array printf, es funktioniert gut, und das Programm wird normal fortgesetzt. So funktioniert das:

printf("%s\n", array[4]); 

Der letzte Index vor NULL passiert 4 in meinem Testfall. Aber dann, wenn das gleiche wie in der vorherigen Schleife gemacht wird, schafft es es, es zu drucken, stürzt aber sofort ab und druckt die zweite Zeile nicht mehr.

+0

Es ist wahrscheinlich, dass das letzte Array-Element nicht mit dem Zeiger "NULL" gesetzt ist. Du brauchst etwas wie 'array [n] = NULL;', wobei 'n' die Anzahl der Strings ist. Natürlich würde das "Array" einen Raum für "n + 1" Elemente benötigen. –

Antwort

2

Wenn Sie nicht explizit das letzte Element des String-Array initialisieren null zu sein, es wird eine nicht initialisierte (das heißt wilde Zeiger) sein, also, wenn Sie dereferenzieren es in printf wird es zum Absturz bringen.

Dinge zu tun:

  1. Explizit das letzte Element des String-Array initialisieren NULL zu sein, so dass die Schleife tatsächlich am Ende zu stoppen wissen.
  2. Anstatt den Zeiger zu inkrementieren, erhöhen Sie den Offset, bei dem Sie ihn mit einer Schleifenzählervariablen dereferenzieren.

Dieser Code funktioniert nur für mich in Ordnung und nicht abstürzt:

#include <stdio.h> 
char *array[] = { "Hello", "World", "My", "Name", "Is", "Govind", "Parmar", NULL } ; 

int main() 
{ 
    int i; 
    for(i = 0; *(array+i); i++) 
    { 
     printf("%s\n", *(array+i)); 
    } 
    printf("after last print\n"); 
    return 0; 
} 
+0

Ich habe getestet und der letzte ist NULL, und es stürzt trotzdem ab, nachdem es geschafft hat, das letzte * Array zu drucken, aber nicht das letzte 'nach dem letzten Druck' mehr = =. –

+0

@ VilleMiekk-oja sehe meine bearbeitete Antwort –

+0

Mit Ihrem Code konnte ich das Programm in einen Zustand bringen, in dem es nach dem letzten Druck printf vor dem Absturz. Es stürzt anschließend auf speicherfreie Funktionen ab. Was ich nicht verstehe, warum es in meiner Version des Codes nicht gedruckt wurde, stürzt es sogar eindeutig ab, um nach der Funktion zu codieren. Aber dein Code hat es irgendwie geschafft, also gebe ich dir die richtige Antwort. –

0

ich aus Code kommentiert, die nach der Verwendung dieser Funktion kommt. Dies führte zu einem vollständig erfolgreichen Ausführen des Codes. Offensichtlich war die Ausführungsreihenfolge des Codes nicht so linear, dass Zeile für Zeile ausgeführt würde. Aber nach dem letzten * array print versuchte es Code auszuführen, der nach der Funktion kam. Jetzt, als ich diesen Code auskommentiert habe, funktioniert die Funktion wie ein Zauber.

Wer interessiert ist, der Code, den ich auskommentiert habe, bezog sich auf die Freigabe von Speicher aus den * Arrays.