2016-09-25 10 views
0

関数内に 'c'が印刷されているときに、両方の文字列の連結が得られます。ただし、ポインタのアドレスが返され、出力が適切ではありません。私が見ポインタへの文字配列の引き渡しと文字列の連結

#include <stdio.h> 

char* comp(char* s,char* t) 
{ 
int count=0; 
char *c; 
c=s; 
while(*s!='\0') 
    s++; 
for(;*t!='\0';t++,s++) 
    *s=*t; 
return c; 
} 

int main(){ 
char* i; 
char c[]= "hello there"; 
char f[]="world"; 
i=comp(&c,&f); 
printf("%s",i); 
return 0; 
} 
+2

[Cでのメモリアドレスの印刷方法](http://stackoverflow.com/questions/30354097/how-to-printf-a-memory-address-in-c) – wasthishelpful

+1

明確にするには、あなたは* "*ポインタ変数のアドレスを返す" *ではありません。もしあなたがそれをしたら、あなたは(幸いにも)しないでください。ポインタを返すだけです。また、間違った引数で関数を呼び出すこともあります。呼び出しの中でアドレス演算子を使用せず、そのまま配列を渡すと、コンパイラはそれらを最初の要素へのポインタに崩壊させます。例えば、配列 'f'の式' f'と '&f [0]'は同じです。 '&f'という表現は実際には間違っています。 –

+0

最も可能性の高い読み取り専用メモリの場所にデータを追加しようとしています。そして、それが読まれていなくても、まだ割り当てられたメモリを過ぎています。これは未定義の動作です。あなたは未定義の振る舞いがあるときに「なぜ」と尋ねることはありません。 –

答えて

3

問題:あなたは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'; 

こと未定義の行動の原因ですまたは範囲外のインデックスを使用して配列の要素を上書きしているからです。範囲外のインデックスを使用して配列の要素にアクセスすることも、定義された動作の原因となります。

+0

ありがとう!しかし、少し精巧に問題を説明できますか?私はcでメモリ管理について多くのアイデアを持っていませんが、私は本当に学びたいと思います。 –