文字列をコピーするプログラムです。
<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