我正在准备有关C编程的考试,并且遇到了以下问题,我不确定该如何回答:
“给出了以下语法正确的声明。假定所有变量已在后续指令中初始化:
void *vptr, *wptr;
char *s;
size_t vsize, ssize;
int cmp;
这些指令中的三个在语义上是不正确的,并且会导致编译错误,这是什么?
vptr++;
cmp = vptr == wptr;
vsize = sizeof(*vptr);
s = wptr;
s = vptr - 1;
vptr = malloc(ssize * sizeof *s);
当我尝试以某种方式(使用gnu编译器)编译它们时,我从未收到错误。但是我的猜测是3、5和6是不正确的,因为我试图获取void的大小(3),访问/分配未分配的内存(5)并分配内存而不释放先前的内存(6)。我不太确定自己的答案,再加上我不明白为什么这些说明对所有编译都适用。有人解释吗?
几乎正确。
错误的是(a),(c)和(e)(编辑后的1,3,5)。
它们的解释基本上是相同的:(a)和(e)执行指针算术,这在上是不可能的void *
,因为它void
是未知的并且没有大小。(c)类似,再次sizeof()
给出一个void
表达式,void
没有大小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句