2017-08-29 680 views
-1

は、ここに私のプログラムです:C: "zshの:中止" エラー

#include <stdio.h> 

char *ft_strcat(char *dest, char *src) 
{ 
    int i; 
    int k; 

    i = 0; 
    k = 0; 
    while (dest[i]) 
     i++; 
    while (src[k]) 
    { 
     dest[i + k] = src[k]; 
     //i++; 
     k++; 
    } 
    dest[i + k] = '\0'; 
    return (dest); 
} 

int main(){ 
    //ft_strcat 
    char str[] = "Hello, "; 
    char str2[] = "World!"; 
    printf("%s", ft_strcat(str, str2)); 
    return 0; 
} 

それはstrcatの機能を実装しています。 「ワールド」をコピーしようとしています。 「こんにちは」には、「zsh:abort」というエラーがあります。 "Hello"にコピーしようとしても問題ありません。

このエラーはどうすればよいですか?このコンマが原因でこの問題が発生するのはなぜですか?

+1

すべての警告とデバッグ情報(例: 'gcc -Wall -Wextra -g'と[GCC](http://gcc.gnu.org/))でコンパイルしてください[https:// 'gdb'デバッガ –

+0

' valgrind'を使ってメモリエラーを見ることができます –

答えて

2

空の次元を持つ配列を定義し、中括弧で囲まれた初期化子リストで初期化すると、配列のサイズは、指定された初期化子リスト要素によって決まります。

だから、あなたのケースでは、strstr2文字列それぞれ"Hello, ""World!"を保持するのに十分なだけ長いです。

したがって、ここで問題となるのは、宛先バッファ(ft_strcat()の最初の引数として渡される)は、を連結するためのスペースが全くないことです。の結果です。バインドされていないメモリにアクセスしているため、undefined behaviorが発生しています。 whileループの最初の反復で

while (src[k]) 
    { 
     dest[i + k] = src[k]; 
     //i++; 
     k++; 
    } 
dest

ためi+k点結合したメモリのうちのインデックス。インデックスを使ってメモリの場所にアクセスしようとするよりもすぐにUBに直面します。

連結先の結果を保持するのに十分な領域があることを確認する必要があります。そのためには、2つの方法があります。

  • より大きい配列サイズを静的に定義し、それを宛先として使用します。この場合は、文字列(ヒント:sizeofstrlen())として使用されるキャラクタ型配列であるため、実際のサイズと既に使用されているサイズを簡単に確認できます。
  • ポインタを使用して、メモリアロケータ関数を使用して一定量のメモリを割り当て、必要に応じてrealloc()を割り当てることができます。