2

私はfedora 14でいくつかの低レベルのCコードを書いていましたが、このコードに夢中になりました。最初の配列は「0」に初期化されていませんが、2 番目の配列は初期化されています。gdb を数回使用しましたが、魔法のようです。何が起こっている?

const int maxsize=100000;
char num[7];
char tnum[6];
int pos=0;
while(pos<(maxsize+1)) {
  int c=0;
  int j=0;

  int myindex;
  int tindex;
  for(myindex=0;myindex<7;myindex++) num[myindex]='0';
  for(tindex=0;tindex<6;tindex++) tnum[tindex]='0';
//....
}

gdbと の両方でp num、の内部に配列値を出力p tnump num[0]ましp tnum[0]た。また、プレーン0として初期化しようとしましたが、同じことが起こります。

ここにデバッガの出力があります

Temporary breakpoint 1, main () at inversionscount.c:3
3   int main() {
Missing separate debuginfos, use: debuginfo-install glibc-2.13-1.i686
(gdb) s
5   const int maxsize=100000;
(gdb) s
6   int startarray[maxsize];
(gdb) s
14  int pos=0;
(gdb) s
15  while(pos<(maxsize+1)) {
(gdb) s
19      int c=0;
(gdb) s
20      int j=0;
(gdb) s
24      for(myindex=0;myindex<7;myindex++) num[myindex]='0';
(gdb) s
25      for(tindex=0;tindex<6;tindex++) tnum[tindex]='0';
(gdb) s
27      while( c=getchar()!="\n") {
(gdb) p num
$1 = "\370\377\277\270\367\377"
(gdb) p tnum
$2 = "000000"
(gdb) 
4

3 に答える 3

1

とはmaxsize? デバッガーを使用してシングルステップ実行することにより、コードが実行パスに従っていることを確認します。

また、魔法の定数を繰り返さないでください。for ループは次のように記述したほうがよいでしょう。

size_t i;

for(i = 0; i < sizeof num; ++i)
  num[i] = '0';
for(i = 0; i < sizeof tnum; ++i)
  tnum[i] = '0';

または、これらはchar配列であるため、次を使用しますmemset()

#include <string.h>

memset(num, '0', sizeof num);
memset(tnum, '0', sizeof tnum);
于 2012-06-18T18:16:03.333 に答える
0

両方のアレイにmemsetを使用する必要があります。

#include <string.h>
char num[7];
memset(num, '\0', sizeof(num));
于 2012-06-18T18:17:27.437 に答える
0

'0'配列が文字リテラルで初期化されていることをどのように確認しますか? それらを文字列として出力する場合、文字列は null で終了し、配列はそうではないことに注意してください。

これを追加:

 num[sizeof num - 1] = '\0';
 tnum[sizeof tnum - 1] = '\0';

それらを印刷する前に:

printf("%s\n", num);
printf("%s\n", tnum);

また、表示可能な文字であるwhile'\0'int値にも注意してください。0'0'0

于 2012-06-18T18:16:26.130 に答える