2016-04-02 9 views
0

ich manchmal Fehler erhalten, wenn Sie diesen Code ausführen:Was ist los mit meinem C-Code (Meine Ausgabe ist wegen malloc flüchtig)?

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

int digits(int n){ 
    int count = 0; 
    while(n!=0) 
    { 
     n/=10;    /* n=n/10 */ 
     ++count; 
    } 
    return count; 
} 

int fib(int n){ 
    int r; 
    if(n == 1 || n == 0) 
     return 0; 
    else if(n == 2) 
     return 1; 
    r = fib(n-1) + fib(n-2); 
    return r; 
} 

void function(void){ 
    char* test;  //number you want to scan 
    int* table; 
    int length, length2, test2 = 0, number, l, random = 0, j = 1, buffer; 
    test = malloc(sizeof(test)); 
    table = malloc(sizeof(table)); 
    scanf("%s", test); 
    number = atoi(test); 
    length = strlen(test);  //length of input test number 
    while(test2 < length + 1){ 
     printf("fib(%d) = %d\n", j, fib(j)); 
     buffer = table[j - 1] = fib(j); 
     test2 = digits(buffer); 
     j++; 
    } 
    //input size of "table" into "length2" 
    length2 = j - 1; 
    for(l = 0; l < length2; l++){ 
     if(table[l] == number){ 
      printf("YES\n"); 
      random = 1; 
      break; 
     } 
    } 
    if(random == 0) 
     printf("NO\n"); 
    free(table); 
    free(test); 
} 

int main(void){ 
    int num, i; 
    scanf("%d", &num); 

    for(i=0; i < num; i++){ 
     function(); 
    } 
    return 0; 
} 

Und dies ist die Ausgabe:

3 
2 
fib(1) = 0 
fib(2) = 1 
fib(3) = 1 
fib(4) = 2 
fib(5) = 3 
fib(6) = 5 
fib(7) = 8 
fib(8) = 13 
YES 
*** Error in `./Am_I_a_Fibonacci_Number': free(): invalid next size (fast): 0x08384018 *** 
Aborted (core dumped) 

erste Zahl ist, wie viel Input, der Benutzer möchte zählen (in diesem Fall 3) und Die 2. (in diesem Fall 2., 3. und 4.) Zahl ist die Nummer, die Sie testen möchten, ob es sich um eine Fibonacci-Nummer handelt oder nicht. Entschuldigung, wenn das sehr schwer zu lesen ist, muss ich viel lernen.

+2

Sie sind nicht "malloc" eine richtige Menge an Speicher. Zugewiesene Beträge sollten etwas wie "sizeof (char) * somesize" und "sizeof (int) * anothersize" sein; Jetzt reservieren Sie gerade genug, um Ihren Zeiger zu speichern. –

+0

Sie müssen auch nicht wirklich malloc in diesem Programm verwenden. –

+0

@AnttiHaapala Danke! Jetzt verstehe ich. Wenn ich es so schreibe, weise ich einen Speicherblock zu, der der Größe meines POINTERs entspricht, nicht die tatsächliche Größe der Dinge, die ich im Speicher speichern möchte, auf die die Variable zeigt. – IronEdward

Antwort

1

Sie reservieren nicht genügend Speicher, so dass Sie den Heap verfälschen. sizeof() angewendet auf einen Zeiger (wie in Ihrem Programm) ergibt normalerweise 4 oder 8, abhängig von der Architektur. Offensichtlich reicht dies für test, ist aber definitiv zu wenig für table.

Sie müssen herausfinden, wie viel Speicher Sie wirklich benötigen, und verwenden Sie dies als Argument in malloc.

1
test = malloc(sizeof(test)); 
table = malloc(sizeof(table)); 

"test" ist eine Variable vom Typ char *. Eine solche Variable hat typischerweise eine Größe von 4 oder 8 Bytes. Sie reservieren also Speicher für 4 oder 8 Bytes, was für 4 oder 8 Zeichen ausreicht.

"Tabelle" ist eine Variable vom Typ int *. Wiederum typischerweise 4 oder 8 Bytes. Die Zuweisung von 4 oder 8 Bytes reicht normalerweise für 1 oder 2 Ints. Wenn Sie versuchen, mehr zu speichern, werden die Dinge schlecht verlaufen.

Finden Sie heraus, wie viele Zeichen und Ints Sie zuweisen möchten, und rufen Sie dann zum Beispiel tabelle = malloc (required_elements * sizeof (int)).