2

我在 Fedora 14 上写了一些低级的 c 代码,但是对这段代码发疯了。第一个数组未初始化为'0',第二个是。通过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,包括 asp nump tnumas p num[0]and 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

你如何检查你的数组是否用'0'字符文字初始化?如果您将它们打印为字符串,请记住字符串以 null 结尾,而您的数组不是。

添加这个:

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

在打印它们之前:

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

还要注意'\0'的是int0while'0'是可打印字符0

于 2012-06-18T18:16:26.130 回答
0

您应该对两个数组都使用 memset:

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