2016-11-17 1 views
-1

Iam versucht, Befehlszeilenargumente zu lesen und sie in einem Array von Ganzzahlen zu speichern. Wenn ich den Code kompiliere, bekomme ich keine Fehler. Wenn ich den Code ausführen, bekomme ich - Segmentierungsfehler Core Dump. Was könnte das Problem sein?Segmentierungsfehler beim Versuch, Befehlszeilenargumente in einem Integer-Array zu kopieren

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

int main(int argc,char *argv[]) 
{ 
    int N = argc; 
    int i = 0; 
    int a[N]; 

    printf("\n Number of arguments: %d", argc); 

    if(argc>1){ 
     for(i = 0;i<argc;i++){ 
      a[i] = atoi(argv[i+1]); //read variables from command line to a[i] 
     } 
    } 
    else { 
     printf("\n Insufficient Arguments.... Exit()"); 
     exit(1); 
    } 

    printf("\n The values stored in the array are: "); 
    for(i = 0;i<argc-1;i++){ 
     printf("\n %d",a[i]); //print values 
    } 

    return 0; 
} 
+3

Wenn Sie 1 zu i hinzufügen, werden Sie immer 1 zu viele Argumente lesen. du wolltest 'für (i = 1; i LambdaBeta

+1

Was hat Ihr Debugger gesagt, wo der Absturz war? – melpomene

+2

Willkommen bei Stack Overflow. Es scheint so, als müssten Sie lernen, wie Sie einen Debugger verwenden, um Zeile für Zeile durch Ihren Code zu gehen, wodurch Sie wahrscheinlich leicht die Art und den Ort des Problems bestimmen können, das Sie haben. Die Verwendung eines Debuggers ist in jedem Fall das erforderliche Wissen für jeden Programmierer. Weitere Informationen finden Sie unter [Debuggen kleiner Programme] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

Antwort

-1

Soweit ich weiß, müssen Arrays einen genauen Wert zur Kompilierzeit haben. Es gibt eine Problemumgehung, indem Sie das Schlüsselwort new verwenden.

Der folgende Code kompiliert nicht auf Visual C++ Express 2010.

int N = argc; 
int a[N]; 

Beachten Sie, dass der gleiche Compiler nicht ein Array erstellen, die Größe Null hat, so dass sein sollte, wo Ihr Problem liegt.

+0

Arrays variabler Länge (VLA) sind eine C99-Sache. VC++ 2010 berücksichtigt C99 nicht. Spätere Versionen werden besser, aber anscheinend unterstützen sie VLA immer noch nicht. https://msdn.microsoft.com/en-us/library/zb1574zs.aspx Die ISO C Sache zu tun wäre, den Speicher mit malloc zuzuweisen. 'int * a = malloc (sizeof (int) * argc)' – Schwern

+0

C hat kein Schlüsselwort 'new'. – melpomene

+0

Vielen Dank für Ihre Korrektur. Ich hatte nicht bemerkt, dass es sich bei dieser Frage nicht um C++ – Daniel

2

Das Problem ist, dass Sie am Ende von argv hier gehen.

for(i = 0; i < argc; i++){ 
    a[i] = atoi(argv[i+1]); 
} 

Wenn ich laufen ./test 2 3 4 5 dann argc 5 und argv geht von 0 bis 4. Ihre for Schleife 0-4 geht, aber Sie sehen argv[i+1] die 1 bis 5

Es ist besser, Haben Sie Ihre for Schleife über Iterieren über das eine oder andere Array. In diesem Fall ist es ein wenig einfacher, es als Iterieren über argv beginnend bei 1 zu betrachten, unter Verwendung von argc für die Grenzen und unter Verwendung von i als Index für argv.

for(i = 1; i < argc; i++){ 
    a[i-1] = atoi(argv[i]); 
} 
+1

handelte. Es funktionierte! Ich habe die for-Schleife geändert. – santoshsmalagi

Verwandte Themen