C 中是否存在与 C++ 的位置新的等效项?我的意思是,可以在 C 中的指定位置构造对象吗?可以realloc()
用于那个吗?
问问题
499 次
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 回答