2016-02-29 28 views
8

Ich habe zwei zusätzliche Zeichen am Anfang meiner Zeichenfolge hinzugefügt und ich kann nicht herausfinden, warum. Die Zeichen erscheinen nicht einmal im Code. Ich bin hier ratlos. Dies ist mein Code:Zusätzliche Zeichen am Anfang der Zeichenfolge hinzugefügt?

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

char *chars; 

char* vector(char input, char *newlist); 

int main(){ 

    char *input, *out = "Input: "; 

    printf("Enter characters: ");     
    while(1){ 
     char i = getchar();       //get input 
     if(i == '\n'){ 
      break;         //detect a return key 
     } else{ 
      input = vector(i, input);    //call vector 
     } 
    } 

    char * print = (char *)malloc(1 + strlen(input) + strlen(out)); 
    strcpy(print, out);        //concat the strings 
    strcat(print, input); 

    printf("\n%s", print);       //print array 

    free(print); 
    free(input); 
    free(chars); 

    return 0;          //exit 
} 

char* vector(char in, char *newlist){ 

    int length = strlen(newlist);     //determine length of newlist(input) 

    chars = (char*)calloc(length+2, sizeof(char)); //allocate more memory 
    strcpy(chars, newlist);       //copy the array to chars 
    chars[length] = in;        //appened new character 
    chars[length + 1] = '\0';      //append end character 

    return chars; 
} 

Aus irgendeinem Grund erzeugt der Code folgendermaßen aus:

Enter characters: gggg 

Input: PEgggg 

Wenn es diese produzieren sollte:

Enter characters: gggg 

Input: gggg 
+3

Was bedeutet 'input'? – immibis

+0

Seitennotiz: da 'chars' eine globale Variable ist, gibt es keinen 'return chars;'. –

+0

@barakmanos wäre es besser, die globale Variable zu entfernen und es lokal zu haben "vector" –

Antwort

5

Sie bestanden nicht initialisierten input-vector() und verwendet es, so dass Sie undefined Verhalten aufgerufen.

Versuchen Sie, char *input zu char *input = "" zu ändern.

Entfernen Sie auch free(chars);, oder Sie werden Doppel-Problem auftreten.

+0

Es gibt auch ein Speicherleck mit dem 'calloc'd Speicher im Vektor. –

+1

Ein weiteres Problem ist, dass der von 'Calloc' zugewiesene Speicher niemals freigegeben wird. Der beste Weg dies zu tun ist, dass "vector" 'free (newlist)' nennt; Daher muss der Anfangswert von "input" entweder "calloc (1,1);" oder "NULL" sein, wobei "vector()" einen speziellen Fall hat, um eine Nulleingabe zu verarbeiten. –

1

Die Initialisierung von char * fehlt und führt daher zu undefiniertem Verhalten. Pls initialisiert die char *

5

Ich denke, Sie haben ein oder mehrere nicht initialisierte Felder. Ich erhalte diese Warnungen, wenn ich versuche zu kompilieren:

$ clang -Weverything vector.c 
vector.c:15:18: warning: implicit conversion loses integer precision: 'int' to 'char' [-Wconversion] 
     char i = getchar();       //get input 
      ~ ^~~~~~~~~ 
vector.c:19:31: warning: variable 'input' may be uninitialized when used here [-Wconditional-uninitialized] 
      input = vector(i, input);    //call vector 
           ^~~~~ 
vector.c:11:16: note: initialize the variable 'input' to silence this warning 
    char *input, *out = "Input: "; 
      ^
       = NULL 
vector.c:40:33: warning: implicit conversion changes signedness: 'int' to 'unsigned long' [-Wsign-conversion] 
    chars = (char*)calloc(length+2, sizeof(char)); //allocate more memory 
        ~~~~~~ ~~~~~~^~ 
vector.c:38:18: warning: implicit conversion loses integer precision: 'unsigned long' to 'int' [-Wshorten-64-to-32] 
    int length = strlen(newlist);     //determine length of newlist(input) 
     ~~~~~~ ^~~~~~~~~~~~~~~ 
vector.c:5:7: warning: no previous extern declaration for non-static variable 'chars' [-Wmissing-variable-declarations] 
char *chars; 
    ^
5 warnings generated. 

Als ich Asan verwenden what is ASan?, bekomme ich folgende Fehlermeldung:

$ echo 1 2 3 | ./a.out 
Enter characters: 
================================================================= 
==23718==ERROR: AddressSanitizer: attempting double-free on 0x60200000ef70 in thread T0: 
    #0 0x4a5f4b in free /home/development/llvm/3.7.0/final/llvm.src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:30:3 
    #1 0x4cd631 in main (/home/brian/src/so/a.out+0x4cd631) 
    #2 0x7f3b94ef5a3f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x20a3f) 
    #3 0x4174c8 in _start (/home/brian/src/so/a.out+0x4174c8) 

0x60200000ef70 is located 0 bytes inside of 7-byte region [0x60200000ef70,0x60200000ef77) 
freed by thread T0 here: 
    #0 0x4a5f4b in free /home/development/llvm/3.7.0/final/llvm.src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:30:3 
    #1 0x4cd5fa in main (/home/brian/src/so/a.out+0x4cd5fa) 
    #2 0x7f3b94ef5a3f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x20a3f) 

previously allocated by thread T0 here: 
    #0 0x4a63b4 in calloc /home/development/llvm/3.7.0/final/llvm.src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:56:3 
    #1 0x4cd67c in vector (/home/brian/src/so/a.out+0x4cd67c) 
    #2 0x4cd57b in main (/home/brian/src/so/a.out+0x4cd57b) 
    #3 0x7f3b94ef5a3f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x20a3f) 

SUMMARY: AddressSanitizer: double-free /home/development/llvm/3.7.0/final/llvm.src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:30:3 in free 
==23718==ABORTING 
6

Alle Punkte @MikeCat sollen richtig sind, nur hinzufügen, dass die von calloc zugewiesenen Speicher nicht freigegeben wird, was zu einem Speicherverlust führt. Sie können es free wie gesagt von @MM in einem Kommentar, aber für die nächste Zeit, Speicherlecks zu vermeiden, können Sie valgrind:

Let's take your program, as hash.c . Got to the command line and compile it, for eg :

gcc hash.c -Wall 

If your program compiles successfully, an executable or out file will appear. As we have not specified the name of the executable, it's default name will be a.out . So let's run it with valgrind :

valgrind -- leak-check=full ./a.out 

This will run executable, along with valgrind, and if there is a memory leak, it will show it when the executable ends.


If you do not have valgrind installed, you can install it from here .

0

Sie löschen müssen frei (Druck) und weisen pointers.First Doppel genannt frei, und zuletzt verursacht core dumped.Ich arbeite an ubuntu und meine GCC-Version ist 4.8.4

Verwandte Themen