文字列をコピーするプログラムです。
<per>#include <stdio.h>
void st(char *,char *);
int main(void)
{
char c[256],h[/url]="Hello";
st(c,h);
printf("%s\n",c);
return 0;
}
void st(char *c,char *a)
{
int i;
for(i=0;*(a);i++){
c=a;
}
c[i1]='\0';
}</per>
コピーした文字列が表示されません。
どこがおかしいか教えてください
文字列コピー
-
管理人
Re:文字列コピー
あら、そのように書かれていたとは、すみません^^;
しかし無限ループにはならず、257回ループしたところで毎回breakされるのですが、
これは*aの内容がcの256バイトを超えてcに書き込んだことで変更されたことにより
breakされたんでしょうか?
つまりたまたまa[256]が\0であり、c[256]はたまたまその\0がはいったんでしょうか?
aは6バイトのはずですからa[6]~a[256]は何が入っているかわからないですね。
確認したプログラムはこちらで
このようになりました。
*aがi==256の時\0に書き換えられたのでしょうかね。
しかし無限ループにはならず、257回ループしたところで毎回breakされるのですが、
これは*aの内容がcの256バイトを超えてcに書き込んだことで変更されたことにより
breakされたんでしょうか?
つまりたまたまa[256]が\0であり、c[256]はたまたまその\0がはいったんでしょうか?
aは6バイトのはずですからa[6]~a[256]は何が入っているかわからないですね。
確認したプログラムはこちらで
#include <stdio.h>
void st(char *c,char *a){
int i;
for(i=0;*a;i++){
c=a;
printf("%c\n",*a);
}
printf("%dでbreak\n",i);
c='\0';
return ;
}
int main(void){
char c[256],h[/url]="Hello";
st(c,h);
printf("%s\n",c);
return 0;
}
実行結果
H
H
H
H
....(略 256回分)
H
H
H
H
H
←i==256でこの部分*aが\0に書き換えられた?
257でbreak
Helloこのようになりました。
*aがi==256の時\0に書き換えられたのでしょうかね。
-
管理人
Re:文字列コピー
やはりそのようです。
c[256]は*aと同じアドレスですね。
c[256]は*aと同じアドレスですね。
#include <stdio.h>
void st(char *c,char *a){
int i;
for(i=0;*a;i++){
c=a;
}
for(i=0;i<256;i++)
printf("&c[%d]=%d\n",i,&c);
for(i=0;i<6;i++)
printf("&a[%d]=%d\n",i,&a);
c='\0';
return ;
}
int main(void){
int i;
char c[256],h[/url]="Hello";
st(c,h);
printf("%s\n",c);
return 0;
}
実行結果
・・(略
&c[251]=1242047
&c[252]=1242048
&c[253]=1242049
&c[254]=1242050
&c[255]=1242051
&a[0]=1242052
&a[1]=1242053
&a[2]=1242054
&a[3]=1242055
&a[4]=1242056
&a[5]=1242057
Hello