使用realloc和calloc的动态内存分配问题

时间:2011-11-18 04:40:30

标签: c pointers memory-management

请参阅以下功能:

int go(void) {
   int *p, *q;
   p = calloc(10,sizeof(int));
   q = realloc(p, 20 * sizeof(int));
   <<X>>
}

假设两个内存分配函数调用都成功,以下哪个语句在点标记<<X>>处为真。

  1. p和q的值相同。
  2. p指向10个整数,每个整数的值为0.
  3. q指向至少80个字节的内存。
  4. 这个问题在我的C试卷中。除了(2)这显然是真的。关于(1)和(3)我很困惑。任何人都能解释一下吗?

6 个答案:

答案 0 :(得分:2)

结帐the documentation。具体而言(重点补充):

  

返回值

     

成功完成后,大小不等于0,realloc()   返回指向(可能已移动)分配空间的指针。如果大小是   0,空指针或可成功的唯一指针   传递给free()返回。如果没有足够的可用内存,   realloc()返回一个空指针并将errno设置为[ENOMEM]。

因此,pq 可能相同(如果realloc能够调整现有内存块的大小),但不能保证(所以你不应该依赖它)。

根据C standardint必须至少为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)

由于这是一个考试问题,我们必须参考规范。这三个都被认为是假的。

  1. realloc可以返回与p不同的指针。
  2. 如果新分配的空间位于不同的位置,
  3. realloc可以释放p指向的内存。这意味着p仍可能指向十个零,但这不是规范所说的。
  4. 正如其他答案所解释的那样,我们不知道int的大小(这就是我们使用sizeof(int)的原因)。