无法初始化c数组

时间:2012-06-18 18:13:27

标签: c gdb

我在fedora 14上编写了一些低级别的c代码,但对这段代码感到疯狂。第一个数组未初始化为“0”,第二个数组未初始化为“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内打印了数组值,包括p nump tnum以及p 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) 

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

如何检查数组是否使用'0'字符文字初始化?如果将它们打印为字符串,请记住字符串为空终止且数组不是。

添加:

 num[sizeof num - 1] = '\0';
 tnum[sizeof tnum - 1] = '\0';
打印之前

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

另请注意'\0'int0,而'0'是可打印字符0

答案 2 :(得分:0)

您应该为两个阵列使用memset:

#include <string.h>
char num[7];
memset(num, '\0', sizeof(num));