2016-10-17 9 views
0

2文字列を1に結合するプログラムを書いていますが、プログラムは動作していますが、valgrindを使用して多くの警告が表示されますが、私は何日か、まだvalgrindを知りません。 の#include の#include の#includeValgrindは読み書きの無効なサイズです1

char* fun (char* n1, char* n2); 

int main(){ 

    char* string1 = "This home "; 
    char* string2 = "is big"; 
    char* next; 

    printf("Sklejony napis: %s\n", next=fun(string1, string2)); 
    free(next); 
return 0; 
} 

char* fun (char* n1, char* n2) 
{ 


    char* string3 = malloc(sizeof(char)); 



    int index_first = 0, index_second = 0; 

    for(; n1[index_first] != '\0'; index_first++) 
    { 
    string3[index_first] = n1[index_first]; 

    } 

    int index_third = index_first; 

    for(; n2[index_second] != '\0'; index_second++) 
    { 

    string3[index_third] = n2[index_second]; 
    index_third++; 

    } 

    return string3; 
} 

そしてvalgrindのは、このことを言う:

Invalid write of size 1 
==2402== at 0x400659: fun (plik.c:30) 
==2402== by 0x4005E0: main (plik.c:13) 
==2402== Address 0x5203041 is 0 bytes after a block of size 1 alloc'd 
==2402== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2402== by 0x400627: fun (plik.c:22) 
==2402== by 0x4005E0: main (plik.c:13) 
==2402== 
==2402== Invalid write of size 1 
==2402== at 0x400698: fun (plik.c:39) 
==2402== by 0x4005E0: main (plik.c:13) 
==2402== Address 0x520304a is 9 bytes after a block of size 1 alloc'd 
==2402== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2402== by 0x400627: fun (plik.c:22) 
==2402== by 0x4005E0: main (plik.c:13) 
==2402== 
==2402== Invalid read of size 1 
==2402== at 0x4E88C80: vfprintf (vfprintf.c:1632) 
==2402== by 0x4E8F848: printf (printf.c:33) 
==2402== by 0x4005FA: main (plik.c:13) 
==2402== Address 0x5203041 is 0 bytes after a block of size 1 alloc'd 
==2402== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2402== by 0x400627: fun (plik.c:22) 
==2402== by 0x4005E0: main (plik.c:13) 
==2402== 
==2402== Invalid read of size 1 
==2402== at 0x4EB321D: [email protected]@GLIBC_2.2.5 (fileops.c:1301) 
==2402== by 0x4E884CA: vfprintf (vfprintf.c:1632) 
==2402== by 0x4E8F848: printf (printf.c:33) 
==2402== by 0x4005FA: main (plik.c:13) 
==2402== Address 0x520304f is 14 bytes after a block of size 1 alloc'd 
==2402== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2402== by 0x400627: fun (plik.c:22) 
==2402== by 0x4005E0: main (plik.c:13) 
==2402== 
==2402== Invalid read of size 1 
==2402== at 0x4EB3234: [email protected]@GLIBC_2.2.5 (fileops.c:1301) 
==2402== by 0x4E884CA: vfprintf (vfprintf.c:1632) 
==2402== by 0x4E8F848: printf (printf.c:33) 
==2402== by 0x4005FA: main (plik.c:13) 
==2402== Address 0x520304e is 13 bytes after a block of size 1 alloc'd 
==2402== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2402== by 0x400627: fun (plik.c:22) 
==2402== by 0x4005E0: main (plik.c:13) 
==2402== 
==2402== Invalid read of size 1 
==2402== at 0x4C35030: __GI_mempcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2402== by 0x4EB3171: [email protected]@GLIBC_2.2.5 (fileops.c:1319) 
==2402== by 0x4E884CA: vfprintf (vfprintf.c:1632) 
==2402== by 0x4E8F848: printf (printf.c:33) 
==2402== by 0x4005FA: main (plik.c:13) 
==2402== Address 0x520304f is 14 bytes after a block of size 1 alloc'd 
==2402== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2402== by 0x400627: fun (plik.c:22) 
==2402== by 0x4005E0: main (plik.c:13) 
==2402== 
==2402== Invalid read of size 1 
==2402== at 0x4C35040: __GI_mempcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2402== by 0x4EB3171: [email protected]@GLIBC_2.2.5 (fileops.c:1319) 
==2402== by 0x4E884CA: vfprintf (vfprintf.c:1632) 
==2402== by 0x4E8F848: printf (printf.c:33) 
==2402== by 0x4005FA: main (plik.c:13) 
==2402== Address 0x520304d is 12 bytes after a block of size 1 alloc'd 
==2402== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2402== by 0x400627: fun (plik.c:22) 
==2402== by 0x4005E0: main (plik.c:13) 

答えて

0

あなたがそれらを連結またはどこ文字列ライブラリを使用する場合、両方の文字列が含まれている多くのスペースををmallocしなければなりません関数concatです。

///you dont need to specify sizeof because of char is 1 byte information 
string3 = malloc (strlen (n1) + strlen (n2) + 1); 

/* the code is working there*/ 
for(; n2[index_second] != '\0'; index_second++) 
{ 
string3[index_third] = n2[index_second]; 
index_third++; 
} 

///there you have to add \0 terminator at end of 
///function because of loop it is going only to \0 
string3[index_third]='\0'; 
+0

おかげで、私のタスクは、任意の既知のfuctionせずにそれらを連結することだった、私は自分自身確認する必要があります:) – ewazdomu

+0

あなただけの最後にヌルターミネータを追加し、文字列のサイズを拡張する前に、私はバージョンを編集しました文字列ライブラリを使用することができない場合は、strlen(文字列の長さ)を確認してください、あなたが使用できるstrlen関数を実装するのは非常に簡単です – Matovidlo

+0

実際に私はstrlenを使用できますが、今私はWindowsコンパイラでこのコードをチェックし、エラーはありませんが、プログラムの実行後に動作を停止しました – ewazdomu

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

char* fun (char* n1, char* n2); 

int main(){ 

    char* string1 = "This home "; 
    char* string2 = "is big"; 
    char* next; 

    printf("Sklejony napis: %s\n", next=fun(string1, string2)); 
    free(next); 
return 0; 
} 

char* fun (char* n1, char* n2) 
{ 


    char* string3; 
    string3 = malloc(sizeof(strlen(n1) + strlen(n2) + 1)); 




    int index_first = 0, index_second = 0; 

    for(; n1[index_first] != '\0'; index_first++) 
    { 
    string3[index_first] = n1[index_first]; 

    } 

    int index_third = index_first; 

    for(; n2[index_second] != '\0'; index_second++) 
    { 

    string3[index_third] = n2[index_second]; 
    index_third++; 

    } 

    string3[index_third]='\0'; 
    return string3; 
} 
関連する問題