memset的奇怪问题,为什么将我的变量归零?

时间:2018-12-04 21:31:00

标签: c

我的代码有一个奇怪的问题。这就是我正在做的:

out_t *out[c-1];
memset(&out, 0, sizeof(out)*(unsigned int)c-1); //this function is causing me a problem

int Ilosc[c-1];
memset(&Ilosc, 0, sizeof(Ilosc)*(unsigned int)c-1);

我的程序在运行时导致段错误。我在调试器中对此进行了检查:

(gdb)
main () at ..\main.c:103
103         memset(&out, 0, sizeof(out)*(unsigned int)c-1);
(gdb) print c
$23 = 5
(gdb) s
105         int Ilosc[c-1];
(gdb) print c
$24 = 0

基本上,在我的第一个记忆集之后,变量c现在等于零,这导致第二个记忆集不起作用。我完全不知道是什么原因造成的,有人知道这可能是什么吗?

2 个答案:

答案 0 :(得分:2)

select tr.studentID, tr.testID, max(dated) - min(dated) from (select tr.*, max(tr.dated) filter (where tr.grade <> tr.last_grade) over (partition by tr.studentID, tr.testID) as max_other_grade_date from (select tr.*, first_value(tr.grade) over (partition by tr.studentID, tr.testID order by tr.dated desc) as last_grade from testresult tr ) tr ) tr where max_other_grade_date is null or dated > max_other_grade_date group by tr.studentID, tr.testID; 运算符应用于数组时,它给出的是整个数组的大小(以字节为单位),而不是一个元素的大小。因为您要将此值乘以数组元素的数量,所以您所写的内容远远超出了数组的末尾。这将调用undefined behavior

您可以按照以下说明正确清除每个数组:

sizeof

或更妙的是:

out_t *out[c-1];
memset(out, 0, sizeof(out));

int Ilosc[c-1];
memset(Ilosc, 0, sizeof(Ilosc));

这会将所有数组元素初始化为NULL或0,而不必调用out_t *out[c-1] = { NULL }; int Ilosc[c-1] = { 0 };

答案 1 :(得分:1)

您将out声明为指向out_t的指针的数组,但是您的memset操作将其视为out_t的数组,而不是{ {1}}。可能您想这样做:

out_t*

out_t out[c-1]; // out is an array of out_t
memset(&out, 0, sizeof(out));