2016-03-27 28 views
0

Ich weiß nicht, warum ich diese Störung erhalte:Programm auf free() mit einer ungültigen Zeiger Nachricht Absturz

Error in `./prog': free(): invalid pointer: 0x0941600b

Während diesen Code

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

int main() 
{ 
    int test; 
    scanf("%d",&test); 
    while(test) 
    { 
     char *s; 
     int count=0; 
     s=(char *)calloc(10000,sizeof(char)); 
     scanf("%s",s); 
     while(*s) 
     { 
      if(*s=='W') 
       count++; 
      s++; 
     } 
     printf("%d\n",count); 
     free(s); 
     test--; 
    } 
    return 0; 
} 
+1

[Bitte lesen Sie diese Diskussion darüber, warum nicht der Rückgabewert von 'malloc()' und Familie in 'C' umgewandelt werden soll. (Http://stackoverflow.com/q/605845/2173917). –

Antwort

1

In Ihrem Code ausführen, Sie erste tat

s++; //moving the actually returned pointer 

und dann haben Sie versucht,

free(s); //pass the changed pointer 

Also, einmal übergeben Sie nicht den gleichen Zeiger, der von calloc() zurückgegeben wurde. Dies ruft undefined behavior auf.

hinzuzufügen, unter Angabe der C11 Standard, Kapitel §7.22.3.3

[...] if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc , the behavior is undefined.

so die s++ den ursprünglichen Zeiger modifiziert, die nicht mehr die gleiche ist, die durch calloc() und vorbei, das gleiche zu free() ruft UB zurückgegeben wurde . Sie müssen eine Kopie des ursprünglichen Zeigers behalten, um diese später an free() weiterzuleiten.

Das heißt,

  1. Please see this discussion on why not to cast the return value of malloc() and family in C..
  2. Sie sollten immer den Rückgabewert calloc() und Familie überprüfen, bevor Sie den zurückgegebenen Wert verwenden, um Deferefencing des Nullzeigers zu vermeiden, falls der Funktionsaufruf fehlgeschlagen ist.
+1

Vielen Dank für Ihre Erklärung. –

1

Sie rufen free mit dem Wert s, nachdem Sie es inkrementiert haben. Sie müssen den von calloc zurückgegebenen Wert speichern, damit Sie ihn an free übergeben können.

+0

Vielen Dank für Ihre Erklärung. –