問題:あなたはcomp
で連結した文字列を終端のNULLではありません
問題1
。
char* comp(char* s,char* t)
{
int count=0;
char *c;
c=s;
while(*s!='\0')
s++;
for(;*t!='\0';t++,s++)
*s=*t;
// Need this
*s = '\0';
return c;
}
問題2
あなたは間違って関数を呼び出しています。あなたは使用する必要があります:あなたが使用している場合
:
i=comp(c, f); // Not comp(&c, &f)
問題3
は、最も深刻な問題はあなたがになっていないメモリ上で書いているということである
char c[]= "hello there";
char f[]="world";
c
には、文字列「"hello there"
」と「f
」を保持するのに十分なメモリがあります。文字列を保持するメモリ"world"
。これらの制限を超えて書き込もうとすると、未定義の動作が発生します。あなたは使用することができますc
が連結した文字列を保持するための十分なスペースを持っているのでOKでしょう
char c[100]= "hello there";
char f[]="world";
i = comp(c, f);
を。
アップデートは、OPのコメント
char c[]= "hello there";
に応じてに相当します。それに"world"
を追加は
char c[12] = {'h', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'e', 'r', 'e', '\0'};
次の操作を行うと等価です:
c[11] = 'w';
c[12] = 'o';
c[13] = 'r';
c[14] = 'l';
c[15] = 'd';
c[16] = '\0';
こと未定義の行動の原因ですまたは範囲外のインデックスを使用して配列の要素を上書きしているからです。範囲外のインデックスを使用して配列の要素にアクセスすることも、定義された動作の原因となります。
[Cでのメモリアドレスの印刷方法](http://stackoverflow.com/questions/30354097/how-to-printf-a-memory-address-in-c) – wasthishelpful
明確にするには、あなたは* "*ポインタ変数のアドレスを返す" *ではありません。もしあなたがそれをしたら、あなたは(幸いにも)しないでください。ポインタを返すだけです。また、間違った引数で関数を呼び出すこともあります。呼び出しの中でアドレス演算子を使用せず、そのまま配列を渡すと、コンパイラはそれらを最初の要素へのポインタに崩壊させます。例えば、配列 'f'の式' f'と '&f [0]'は同じです。 '&f'という表現は実際には間違っています。 –
最も可能性の高い読み取り専用メモリの場所にデータを追加しようとしています。そして、それが読まれていなくても、まだ割り当てられたメモリを過ぎています。これは未定義の動作です。あなたは未定義の振る舞いがあるときに「なぜ」と尋ねることはありません。 –