我的代码有一个奇怪的问题。这就是我正在做的:
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现在等于零,这导致第二个记忆集不起作用。我完全不知道是什么原因造成的,有人知道这可能是什么吗?
答案 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));