バックグラウンド:
これはすべて、友人が file を使用して作成したプログラムから始まりました。
他の詳細はスキップして、実際に私の注意を引いたものに焦点を当てます。
- ファイルには、文字列として抽出する必要があるテキストがあります。
- 弦の長さが異なる場合があります。
- これを達成し、余分な 1 バイトを費やさないようにするために、彼は動的メモリ割り当てを使用しました。彼は最初にサイズを数えてから、malloc で適切なサイズの文字列を作成し、対象の文字列に文字を挿入しました。
それは良いのですが、余分なバイトなしで文字列に文字を格納する別の方法があるかどうかを考えがちです。
私は次のプログラムを持ってきました:
コード:
/* 簡単にするために、ファイルの代わりに、ここでは別の文字列 "c" を使用しました。ここからデータをコピーする必要があります。ch を File からの読み取り文字と見なします。
# include <stdio.h>
# include <string.h>
void main()
{
char *s,*p;
char c[4] ="abc";
char q[2] = "";
s=q;
int i;
for(i=0;c[i]!='\0';i++)
{
char ch = c[i];
int len = strlen(s);
char p[len+2];
strcpy(p,s);
p[len]=ch;
p[len+1]='\0';
printf("%s\n",p);
s=p;
}
char t[strlen(s)+1];
strcpy(t,s);
printf("%s\n",t); //EDIT for understanding: If I print s here it prints garbage,
but if I see the value of s through debugger, it gives
correct value?
}
理解:
- 文字列 p は for ループにスコープされており、反復ごとに新しい定義を取得しています。
- 文字列の開始アドレスは変数 s に保存されるため、コードがスコープ外に出た場合でもメモリにアクセスできます。これは、新しい文字が検出されたときに文字列のサイズを決定するために使用されます。
質問:
1.上記の私の理解が正しければ、何かが欠けています。strcpy s を t に出力して t を出力する (正しい O/P が得られる) 代わりに、直接 s を出力しようとするとガベージが出力されるためです。この動作についてよくわかりませんか?
2.このプログラムでメモリが破損する可能性はありますか?
PS:複数の strcpy() が過剰に殺されていることを理解しています。したがって、プログラムは最適化されていませんが、この動作を理解するためにこの質問をするだけです。