2016-02-29 16 views
8

Tôi có thêm hai ký tự được thêm vào đầu chuỗi và tôi dường như không thể tìm hiểu lý do. Các ký tự thậm chí không xuất hiện trong mã. Tôi đang thua lỗ ở đây. Đây là mã của tôi:Ký tự bổ sung được thêm vào đầu chuỗi?

#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; 
} 

Đối với một số lý do, mã sản xuất này:

Enter characters: gggg 

Input: PEgggg 

Khi nó nên được sản xuất này:

Enter characters: gggg 

Input: gggg 
+3

'input' trỏ tới điều gì? – immibis

+0

Lưu ý phụ: vì 'chars' là một biến toàn cầu, không có điểm trong' các ký tự trả về '; –

+0

@barakmanos nó sẽ là tốt hơn để loại bỏ các biến toàn cầu và có nó địa phương để 'vector' –

Trả lời

5

Bạn qua uninitialized input-vector() và sử dụng nó, vì vậy bạn đã gọi hành vi không xác định.

Thử thay đổi char *input thành char *input = "".

Đồng thời xóa free(chars); hoặc bạn sẽ gặp phải sự cố kép.

+0

Cũng có rò rỉ bộ nhớ với bộ nhớ 'calloc'd trong vectơ. –

+1

Một vấn đề khác là bộ nhớ được phân bổ bởi 'calloc' không bao giờ được giải phóng. Cách tốt nhất để làm điều này sẽ là cho 'vector' để gọi' free (newlist) '; do đó, giá trị ban đầu của 'input' cần phải là' calloc (1,1); ', hoặc' NULL' với 'vector()' có một trường hợp đặc biệt để xử lý đầu vào null. –

1

Việc khởi tạo char * bị thiếu và do đó dẫn đến hành vi không xác định. Xin vui lòng khởi tạo char *

5

Tôi nghĩ rằng bạn có một hoặc nhiều trường chưa được khởi tạo. Tôi nhận được những cảnh báo này khi tôi cố gắng biên dịch:

$ 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. 

Khi tôi sử dụng Asan what is ASan?, tôi nhận được lỗi sau:

$ 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

Tất cả các điểm @MikeCat được cho là chính xác, chỉ nói thêm rằng bộ nhớ được phân bổ bởi calloc không trả tự do dẫn đến rò rỉ bộ nhớ. Bạn có thể free nó như đã nói bởi @MM trong một chú thích, nhưng đối với thời gian tiếp theo, để tránh rò rỉ bộ nhớ, bạn có thể sử dụng 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

Bạn cần xóa miễn phí (in) và gán cho pointers.First gọi đôi miễn phí, và cuối cùng gây ra lõi dumped.I làm việc trên ubuntu và phiên bản gcc của tôi là 4.8.4

Các vấn đề liên quan