我有以下代码,在64位linux内核2.6.x上。据我所知,第一个mallocrrr=malloc(8),在堆上分配8个字节,rrr现在包含这8个字节的起始地址的值。然后,我做了一些疯狂的事。我试图将一个8字节的指针存储在一个字节中,如*rrr = malloc(8)所示。然后我在第五个字节做同样的操作。一个字节只能容纳255个值,但是当我打印存储在这些字节中的值时,这些值大于255。你能解释一下吗?

#include <stdlib.h>
#include <stdio.h>

void ** rrr;
int main(int argc, char ** argv)
{
  rrr = malloc(8); // rrr should point to the starting address of an 8 byte block
  *rrr = malloc(8);
  *(rrr+5) = malloc(8);

  for(int i =0;i< 8;i++)
    printf("*rrr%d: %p\n", i, *(rrr+i)); // should print what is stored in each byte

 return 0;
}

一轮以上回报
*rrr0: 0x9ae030
*rrr1: (nil)
*rrr2: (nil)
*rrr3: 0x21
*rrr4: (nil)
*rrr5: 0x9ae050
*rrr6: (nil)
*rrr7: 0x21

最佳答案

一个字节只能容纳255个值,但是当我打印
存储在这些字节中的值,大于255
但是*rrr是一个void *,它可能是您机器上的8字节,并且可以根据定义保存任何对象指针。
另外,由于只为rrr分配了8个字节,超过第一个元素的任何内容(赋值或读取)都是非法的。
您似乎认为,分配8个字节会以某种方式在元素之间均匀地分配它们,事实并非如此。分配后rrr指向8个字节,您可以使用*rrr = malloc...来执行此操作。这都是正确的和预期的:*rrr是一个空的,因此能够保存任何地址,因此能够保存您提到的大于255的内容。
当你走到rrr + 1或者更远的地方时,你就进入了未定义的行为,意想不到的事情就会发生。
编辑
但是如果我打印8字节的每个字节值
块,任何字节都可以保存大于255的值
但你没有打印字节!您正在打印指针并将i添加到rrr将其推进到下一个指针。

关于c - 需要澄清的malloc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14791695/

10-12 23:58