【发布时间】:2015-12-25 13:23:39
【问题描述】:
我在一个非常大的 C 程序中观察到了这个问题。
结构声明为:
struct kc910InputParms {
char inStream[71];
}
在程序中,当对该结构变量进行memset 操作时,printf 语句打印的时间超过其限制(即 71 个字符是限制)。请参阅下面在 gdb 中调试时获得的输出。
(gdb) s
cpyInParmsToCbl (in=0xffffb9f6, out=0x80ef320) at kc190Common.c:456
456 memset((void*)out, ' ', sizeof(kc910InputParms));
(gdb) printf "<%s>\n", out.inStream
<>
(gdb) n
458 strncpy(out->inStream+16, in->system_id,strlen(in->system_id));
(gdb) printf "<%s>\n", out.inStream
< Pending>
请注意上面:附加了 7 个额外字符作为“待处理”,这将打印 out.inStream 最多 78 个字符。这在程序的后续阶段引入了缺陷。
有人可以帮我理解这种行为以及使用memset 的正确方法吗(如果我做错了)?
如果发生这种情况是因为变量out.inStream 没有被空字符'\0' 终止,那么我的问题是:为什么它在memset 之前没有以相同的方式打印?
【问题讨论】:
-
您确定您使用的是 C 编译器而不是 C++?
-
要重置 out 指向的内存,只需执行:memset((void*)out, '\0', sizeof(kc910InputParms))。注意空格字符“”和“\0”是两个不同的东西。
-
@alk:是的,我很确定,我使用的是 C 编译器 :)
-
@SelçukCihan:我明白,但我没有在
memset中使用\0,因为在程序中,inStream必须完全使用(70 个字符)。该程序是按照这种方式构建的以处理逻辑。 -
str*()系列函数需要 C-"strings",即:0-terminatedchar-arrays。