Probleme mit atoi(argv[1]) und free(a)



  • Hi Leute habe folgende Probleme:

    - mein Programm soll mit dem atoi-Befehl die Dimension für eine Matrixmultiplikation einlesen(ist im Quelltext auskommentiert). Leider beendet sich das Programm beim Versuch mit atoi den Parameter einzulesen.

    - beim Versuch die Variable double* a* freizugeben, wird auf der Konsole folgender Fehlercode ausgegeben:

    Bitte geben sie die Dimension ein:
    *** glibc detected *** /home/heiko/workspaceC/VPS2/Debug/VPS2: free(): invalid next size (fast): 0x0000000000602010 ***
    Ergebnis der Multiplikation: 18.000000 / 27.000000 / 36.000000 / ======= Backtrace: =========
    /lib64/libc.so.6(+0x733b6)[0x7ff7036db3b6]
    /lib64/libc.so.6(cfree+0x6c)[0x7ff7036e02dc]
    /home/heiko/workspaceC/VPS2/Debug/VPS2[0x4007ee]
    /lib64/libc.so.6(__libc_start_main+0xfd)[0x7ff703686bfd]
    /home/heiko/workspaceC/VPS2/Debug/VPS2[0x400559]
    ======= Memory map: ========
    00400000-00401000 r-xp 00000000 08:07 2753319 /home/heiko/workspaceC/VPS2/Debug/VPS2
    00600000-00601000 r--p 00000000 08:07 2753319 /home/heiko/workspaceC/VPS2/Debug/VPS2
    00601000-00602000 rw-p 00001000 08:07 2753319 /home/heiko/workspaceC/VPS2/Debug/VPS2
    00602000-00623000 rw-p 00000000 00:00 0 [heap]
    7ff6fc000000-7ff6fc021000 rw-p 00000000 00:00 0
    7ff6fc021000-7ff700000000 ---p 00000000 00:00 0
    7ff703452000-7ff703467000 r-xp 00000000 08:06 786574 /lib64/libgcc_s.so.1
    7ff703467000-7ff703666000 ---p 00015000 08:06 786574 /lib64/libgcc_s.so.1
    7ff703666000-7ff703667000 r--p 00014000 08:06 786574 /lib64/libgcc_s.so.1
    7ff703667000-7ff703668000 rw-p 00015000 08:06 786574 /lib64/libgcc_s.so.1
    7ff703668000-7ff7037cc000 r-xp 00000000 08:06 786576 /lib64/libc-2.11.3.so
    7ff7037cc000-7ff7039cb000 ---p 00164000 08:06 786576 /lib64/libc-2.11.3.so
    7ff7039cb000-7ff7039cf000 r--p 00163000 08:06 786576 /lib64/libc-2.11.3.so
    7ff7039cf000-7ff7039d0000 rw-p 00167000 08:06 786576 /lib64/libc-2.11.3.so
    7ff7039d0000-7ff7039d5000 rw-p 00000000 00:00 0
    7ff7039d5000-7ff7039f3000 r-xp 00000000 08:06 786593 /lib64/ld-2.11.3.so
    7ff703bd0000-7ff703bd3000 rw-p 00000000 00:00 0
    7ff703bf0000-7ff703bf2000 rw-p 00000000 00:00 0
    7ff703bf2000-7ff703bf3000 r--p 0001d000 08:06 786593 /lib64/ld-2.11.3.so
    7ff703bf3000-7ff703bf4000 rw-p 0001e000 08:06 786593 /lib64/ld-2.11.3.so
    7ff703bf4000-7ff703bf5000 rw-p 00000000 00:00 0
    7fff3e6ad000-7fff3e6ce000 rw-p 00000000 00:00 0 [stack]
    7fff3e74f000-7fff3e750000 r-xp 00000000 00:00 0 [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]){
    	int n;
    	printf("Bitte geben sie die Dimension ein:\n");
    
    	n = 3;//atoi(argv[1]);
    
    	double **a;
    	a = (double**)malloc(sizeof(double*)*n);
    	int i,j;
    	for(i=0; i <5; ++i){
    	  a[i] = (double*)malloc(sizeof(double)*n);
    	}
    
    	double* x;
    	double* b;
    	x = (double*) malloc(sizeof(double)*n);
    	b = (double*) malloc(sizeof(double)*n);
    
    	//Matrix a un Vektor x initialisieren
    	for( i=0; i < n; ++i){
    		x[i] = i + 1;
    		for(j=0; j < n; ++j){
    			a[i][j] = (i+2)*(j+1);
    		}
    	}
    
    	for(i=0; i < n; ++i){
    		for(j=0; j < n; ++j){
    			b[i] = a[i][j]*x[j];
    		}
    	}
    
    	printf("Ergebnis der Multiplikation: ");
    	for(i=0; i < n; ++i){
    		printf("%lf  /  ",b[i]);
    	}
    
    	//free(a) // wie gebe ich a wieder frei
    	free(x);
    	free(b);
    
    	return 0;
    }
    

    Kann mir bitte jemand helfen. Danke



  • Schau mal, wieviele double* Du in Zeile 11 reservierst und vergleiche mit der Anzahl der Werte, die Du in der darauffolgenden Schleife in das Array reinpacken möchtest.



  • Das argv[1] ist der 1. Parameter beim Aufruf über die Kommandozeile.
    Deswegen ist dein printf("Bitte geben sie die Dimension ein:\n"); sinnlos, da du zu dem Zeitpunkt den Wert schon eingegeben haben musst.

    Wenn du da nichts angegeben hast, wird in argv[1] NULL drin stehen. Und das mag atoi nicht.
    Darum solltest du auch überprüfen ob argc > 1 ist. Denn nur dann steht auch was in argv[1].



  • ok mit dem free(a) klappt jetzt alles -danke- allerdings weis ich nicht was da bei dem atoi innerhalb vor sich geht und habe daher auch keine ahnung wie ich das problem beheben kann.

    Hab keine erfahrung mit c, bin grad dabei c++ zu lernen, deswegen weis ich nicht was da innerhalb vor sich geht

    Kann mir jemand erklären, wie man mit atoi umgeht?



  • Wie rufst du das kompilierte Programm auf?



  • Habe es in eclipse und im terminal(grad eben) ausgeführt. In beiden Fällen zeigt er "Bitte geben sie die Dimension ein" an und beendet sich danach, auf der Konsole zusätzlich Speicherzugriffsfehler an.
    Muss er den Parameter nicht von der Kommandozeile lesen, wird das Programm fehlerfrei ausgeführt



  • Das argv ist für Parameter von der Kommandozeile gedacht:

    C:>matrixmul 3
    

    Wenn du den Wert im Programm eingeben willst nimm statt n = 3;//atoi(argv[1]);

    scanf("%d",&n);
    


  • Danke mit scanf() funktionierts, in meiner aufgabenstellung ist aber explizit gefordert, dass ich mit atoi(argv[1]) den Parameter einlese



  • Das liegt daran, dass du keinen Komandozeilenparameter angibts. Denkst du Eclipse macht das automatisch fuer dich? Siehe DirkB.



  • wie gesagt, kenne mich nicht aus und weis daher nicht wie ich einen Kommandozeilen Parameter richtig anlege.
    Ich arbeite auch erst seit kurzer Zeit mit Linux

    Muss ich das irgendwie im Quelltext mit angeben oder bevor ich das Programm starte???



  • Nimm den Beitrag von dirkb:

    DirkB schrieb:

    Das argv ist für Parameter von der Kommandozeile gedacht:

    C:>matrixmul 3
    

    Oder unter Linux von der Shell aus dort wo das übersetzte Programm liegt ./matrixmul 3

    Weiterhin beachte meinen Beitrag:

    LordJaxom schrieb:

    Schau mal, wieviele double* Du in Zeile 11 reservierst und vergleiche mit der Anzahl der Werte, die Du in der darauffolgenden Schleife in das Array reinpacken möchtest.



  • OK hab gefressen: <Pfad>/<Dateiname> <Parameter> // natürliche ohne < > 🙂

    Es gibt keine andere Möglichkeit, mit atoi, dass er zuerst "Bitte geben sie die Dimension ein" ausgibt und dann der Parameter eingegeben wird,außer mit scanf(), oder???



  • Du kannst mit argc prüfen, wie viele Parameter übergeben wurden. Wenn weniger als 2 Übergeben werden (der erste ist der Programmname) gibst du halt einen Hilfetext aus ("usage: matrixmul <matrixsize>") oder fragst mit scanf nach.



  • Sollst du atoi() und argv[1] nehmen oder nur atoi()?


Anmelden zum Antworten