请参阅以下功能:
int go(void) {
int *p, *q;
p = calloc(10,sizeof(int));
q = realloc(p, 20 * sizeof(int));
<<X>>
}
假设两个内存分配函数调用都成功,以下哪个语句在点标记<<X>>
处为真。
这个问题在我的C试卷中。除了(2)这显然是真的。关于(1)和(3)我很困惑。任何人都能解释一下吗?
答案 0 :(得分:2)
结帐the documentation。具体而言(重点补充):
返回值
成功完成后,大小不等于0,realloc() 返回指向(可能已移动)分配空间的指针。如果大小是 0,空指针或可成功的唯一指针 传递给free()返回。如果没有足够的可用内存, realloc()返回一个空指针并将errno设置为[ENOMEM]。
因此,p
和q
可能相同(如果realloc
能够调整现有内存块的大小),但不能保证(所以你不应该依赖它)。
根据C standard,int
必须至少为16位(2字节),因此sizeof(int)
至少为40,因此(3)不一定是真的。< / p>
答案 1 :(得分:1)
正如布兰登所说,(1)不一定是真的(也可能不是真的)。
在C中,通常“int”是4个字节,因此(3)应该为真。在我所知道的所有系统上都是如此,尽管我不肯定C标准说“int”必须是四个字节长。
答案 2 :(得分:0)
q 指向的内存量取决于 int 类型的大小,该类型可能不是四个字节。声明一也不一定正确。从我系统上的realloc(3)
手册页:
如果没有足够的空间 扩大ptr指向的内存分配,realloc()创建一个新的 分配,复制尽可能多的ptr指向的旧数据 到新的分配,释放旧的分配,并返回一个指针 分配的内存。
答案 3 :(得分:0)
1)p和q都是指针。查找realloc为答案做什么的文档。
3)该陈述含糊不清。在C中,指针的值通常是字节位置的标量地址。分配的内存块大小未知。指针的类型用于在执行指针运算时确定步幅的大小,但如果您分配了某种类型的多个大小的缓冲区,则该变量本身仍然是未知的。
答案 4 :(得分:0)
切换这些链接。她们说1可能是真或假它就像不能说http://www.thinkage.ca/english/gcos/expl/c/lib/reallo.html
希望这些信息可以帮助您,因为许多人已经解释过第3个案例
1是真还是假
因为q指向重新分配的内存。如果旧的内存块可以增长(或缩小)到新的大小,这可能与“p”相同;否则,它将是一个不同的块。空间从对齐边界开始,适用于存储任何数据类型的对象。如果无法获取内存或者未正确指定参数,则返回NULL指针。
答案 5 :(得分:0)
由于这是一个考试问题,我们必须参考规范。这三个都被认为是假的。
realloc
可以返回与p
不同的指针。realloc
可以释放p
指向的内存。这意味着p仍可能指向十个零,但这不是规范所说的。