0

このコードが実行されないのはなぜですか? str1 が str2 に割り当てられないのはなぜですか?? strcpy を使用するオプションがあることは知っていますが、これが機能しない理由を知りたいですか??

#include<stdio.h>
int main()
{
char str1[]="hello";
char str2[10];
str2=str1;
printf("%s",str2);
return 0;
}

一方、ポインターを使用すると、ここのように機能します..

#include<stdio.h>
int main()
(
char *s="good morning";
char *q;
q=s;
while(*q!='\0')
{
printf("%c",*q);
q++;
}
return 0;
}

これは機能します。文字列はポインターを介してコピーされたので、なぜそのような違いがあるのでしょうか??

4

5 に答える 5

1

str2静的配列です。ポインターのように再割り当てすることはできません。

ポインターの例については、指しているのと同じスペースを指すようにq=s再割り当てします。ただし、ポインターの再割り当ては値をコピーしません。qs

静的配列strcpy()の場合、値をコピーするために使用します。ポインターの場合は、 を使用しますstrdup()

于 2012-07-08T07:43:06.117 に答える
0

C では、 typeを持つオブジェクトのみを割り当てることができます。C では文字列はデータ型ではありません。代わりに、これは規則です。規則は、文字列が null で終わる文字配列で表されるというものです。また、配列は型と見なされないため、文字列とも見なされません。

2 番目のコード フラグメントでは、単純に;をq指摘しています。sこれはの文字列のコピーsではなく、ポインター 's' の単なるコピーです。どちらもメモリ内の同じデータを参照します。たとえば、's' の文字列を変更し、'q' の文字列を出力すると、'q' のデータも変更されていることがわかります。もっと直接的にするprintf( "s:%p, q:%p" (void*)s, (void*)q ) ; と、両方が同じポインター値を保持していることがわかります。

于 2012-07-08T09:02:31.190 に答える
0

str2およびstr1それらの最初の要素のアドレスを参照するため、配列の割り当てはこの方法では行われません。文字ごとstr[]に割り当てるか、組み込みを使用します。strcpy

于 2012-07-08T07:44:50.143 に答える
0

コピーを格納するために必要な正確な量のスペースを割り当てる strdup() を使用することもできます。

于 2012-07-08T07:45:59.227 に答える
0

あなたがする必要があります

strcpy (str2, str1)

str1 to の各要素をstr2文字ごとにコピーする必要があります。

あなたがしているのは、許可されていないstr1配列 var への割り当てで文字列のアドレスを割り当てようとすることです。str2静的配列を使用して値を割り当てることができませんでした。

あなたが持っていたとしてもchar *str2;str2 = str1コードは機能しますが、そのような場合、文字列はコピーされず、代わりに文字列のアドレスstr1がコピーされるstr2ため、逆参照str2は文字列を指します

また、文字列を にコピーするときは、コピーするchar *str2前に常に十分なメモリを割り当てることに注意してください。1つの可能性は次のとおりです。

str2 = malloc (sizeof (char) * (strlen (str1) + 1));
strcpy (str2, str1);
于 2012-07-08T07:41:33.740 に答える