2016-05-20 11 views
2

Ich habe diesen Code:Warum verursacht die Freigabe des dynamisch zugewiesenen Speichers hier ein Problem?

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

char* creatString(); 
void printWordsThatStartWithLETTER(char letter, char *str); 

void main() 
{ 
    char *strEx1; 
    char letter; 
    strEx1=creatString(); 
    printf("Enter a letter:\n"); 
    scanf("%c",&letter); 
    printWordsThatStartWithLETTER(letter, strEx1); 
    free(strEx1); 
} 

char* creatString() 
{ 
    char *str, *strTemp; 
    int size; 
    strTemp=(char*)malloc(256); 
    printf("enter your string:\n"); 
    flushall(); 
    gets(strTemp); 
    size = strlen(strTemp); 
    str=(char*)malloc(size); 
    strcpy(str,strTemp); 
    //puts(str); 
    free(strTemp); 
    return str; 
} 
void printWordsThatStartWithLETTER(char letter, char *str) 
{ 
    int sizeOfStrinf, i; 
    sizeOfStrinf = strlen(str); 
    for(i=0;i<sizeOfStrinf;i++) 
    { 
     if((str[i]==letter)||(str[i]==letter-32)) 
     { 
      if(i==0) 
      { 
       while(str[i]!=32) 
       { 
        printf("%c",str[i]); 
        i++; 
       } 
       printf("\n"); 
      } 
      else 
       if(str[i-1]==32) 
       { 
        while(str[i]!=32) 
        { 
         printf("%c",str[i]); 
         i++; 
        } 
        printf("\n"); 
       } 
     } 
    } 
} 

es wird nicht frei strEx1, ich Überlauf haben. Wie kann ich strEx1 richtig freigeben?

+2

** Minimaler ** Code, Eingabe, Beobachtete Ausgabe, Erwartete Ausgabe. – DevSolar

+0

'Warnung: 'gets' ist veraltet (deklariert unter /usr/include/stdio.h:638) [-Wdeprecated-declarations]' – LPs

+2

'str = (char *) malloc (Größe);' -> 'str = malloc (Größe + 1); ' – LPs

Antwort

0

Sie reservieren Speicher, der ein Byte zu kurz ist. In einer

size = strlen(strTemp);  
str=(char*)malloc(size+1); 

oder statt strcpy Verwendung Strncpy

size = strlen(strTemp); 
str=(char*)malloc(size); 
strncpy(str,strTemp,size); 

Die Strncpy Funktion kopiert die anfängliche Anzahl Zeichen von strSource zu strDest und strDest zurückgibt. Wenn count kleiner oder gleich der Länge von strSource ist, wird kein Nullzeichen automatisch an die kopierte Zeichenfolge angehängt. Wenn count größer als die Länge von strSource ist, wird die Zielzeichenfolge mit Nullzeichen bis zur Länge aufgefüllt. Das Verhalten von strncpy ist undefiniert, wenn sich die Quell- und Zielzeichenfolgen überschneiden.

4

Sie haben die aktuelle Ausgabe in Ihrem Code, wo Sie

size = strlen(strTemp); 
str=(char*)malloc(size); 

im Grunde tun, sind Sie ein Element kurz, kein Platz für null-Terminator. Also mit später strcpy()

strcpy(str,strTemp); 

Ursachen aus gebundenem Zugriff, die undefined behavior aufruft.

Sie sollten so etwas wie

str = malloc(size + 1); 

tun Das heißt,

  1. Please see this discussion on why not to cast the return value of malloc() and family in C..
  2. Überprüfen Sie immer den Rückgabewert malloc() auf Erfolg, bevor Sie den Rückgabewert verwenden, um Nullzeiger-Dereferenzierung zu vermeiden.
  3. You must not be using gets().