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)
おかげで、私のタスクは、任意の既知のfuctionせずにそれらを連結することだった、私は自分自身確認する必要があります:) – ewazdomu
あなただけの最後にヌルターミネータを追加し、文字列のサイズを拡張する前に、私はバージョンを編集しました文字列ライブラリを使用することができない場合は、strlen(文字列の長さ)を確認してください、あなたが使用できるstrlen関数を実装するのは非常に簡単です – Matovidlo
実際に私はstrlenを使用できますが、今私はWindowsコンパイラでこのコードをチェックし、エラーはありませんが、プログラムの実行後に動作を停止しました – ewazdomu