我在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 num
,p 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)
答案 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'
是int
值0
,而'0'
是可打印字符0
。
答案 2 :(得分:0)
您应该为两个阵列使用memset:
#include <string.h>
char num[7];
memset(num, '\0', sizeof(num));