4

C 中是否存在与 C++ 的位置新的等效项?我的意思是,可以在 C 中的指定位置构造对象吗?可以realloc()用于那个吗?

4

4 回答 4

11

放置 new 只是跳过分配并在预分配的内存中构造一个对象。由于 C 缺少构造函数,因此不需要放置 new。我想等价的将是指针类型转换,因为一旦有了指针,您就可以像存在对象一样行事。

从公共内存池中雕刻不同类型的对象的示例:

char *pool = (char *) malloc( 1000 );
char *pen = pool;

foo *obj1 = (foo *) pen;
pen += sizeof (foo);

bar *obj2 = (bar *) pen;
pen += sizeof (bar);

/* etc */

当然,在执行此操作时,您需要负责将正确的指针传递给free,并注意对齐要求——就像 C++ 中的放置 new 一样。

于 2013-01-15T15:06:25.980 回答
3

由于 C 没有类似构造函数的东西,您可以简单地获取地址并将其转换为指向您要使用的类型的指针。当然,您需要确保正确对齐,否则可能会失败(但在 C++ 中放置 new 也是如此)。

于 2013-01-15T15:06:58.013 回答
2

C 中没有“新位置”之类的东西。另一方面,您可以声明一个指针并使其指向内存中的任何内容:

char *pointer = 0x12345678;

上面的指针现在指向地址0x12345678

这通常用于嵌入式系统,其中某些设备位于内存中的某些位置。

于 2013-01-15T15:06:23.170 回答
1

在 C 中以可移植方式实现此目的的典型方法是:

#define X (*(int*)0x12345678u) // where 0x12345678 is a specific address 

// you can now use the int 'X' as any other type of variable:

X = 5;

if (X == SOMETHING)

这假设地址 0x12345678 包含有效内存, int 将适合,您可以直接访问。具有虚拟内存的系统可能不允许直接访问。

在嵌入式系统中,像上面这样的声明对于定义硬件寄存器是很常见的。

于 2013-01-15T15:42:24.807 回答