也许这是一个简单的问题但我真的很想知道它.
如果我想在内存中的某个特定地址(堆中)存储一个值,比如一个int,我该怎么做?
说,我想将int值10存储在0x16.我想通过调用new或malloc来做到这一点:int*p = new int(10); 然后我想将存储的值的地址设置为0x16.起初我认为像&p = 0x16这样的东西,但这不起作用.我需要这样做以在内存中的某个值前面存储一些附加信息(之前通过malloc或new分配了内存空间).
我正在使用Linux和C++(但C也可以).
我想要实现的是:一个进程调用大小为x的malloc,我想在分配的内存前面存储一个特定的值(大小),所以我可以稍后访问该大小(调用free时).由于调用了malloc,我知道操作系统为该值分配空间的指针,我只想将指定内存的大小存储在指定内存前面的4个字节中.我所做的(在我编写的malloc钩子中)是分配更多内存(通过内部mallok调用)但我还需要能够在特定位置存储此大小值.
我感谢所有的帮助.
如何在运行时检查内存地址是否可写?
例如,我想在以下代码中实现is_writable_address.可能吗?
#include <stdio.h>
int is_writable_address(void *p) {
// TODO
}
void func(char *s) {
if (is_writable_address(s)) {
*s = 'x';
}
}
int main() {
char *s1 = "foo";
char s2[] = "bar";
func(s1);
func(s2);
printf("%s, %s\n", s1, s2);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在安全地使用指针地址的显式数字方面是否存在任何类型的最佳实践?我的意思是以下示例:
#define BASE_ADDRESS 0x10000
typedef struct my_var_list
{
int var1;
int var2;
} my_function_list;
my_var_list *MyVars;
MyVars = BASE_ADDRESS; // Set the address of MyVars to be 0x10000
Run Code Online (Sandbox Code Playgroud)
这可能表明我的一些无知,但你怎么能保证0x10000当时没有被其他东西使用而你不会导致内存损坏?如果您不能假设,是否有任何安全的方法难以定义要使用的地址?
在c ++中是否可以在内存中的特定位置分配对象?我正在实现我的业余爱好os内核内存管理器,它提供void*了存储我的东西的地址,我想知道如何使用该指针在那里分配我的对象.我试过这个:
string* s = (string*)235987532//Whatever address is given.
*s = string("Hello from string\n\0");//My own string class
//This seems to call the strings destructor here even thought I am using methods from s after this in my code...
Run Code Online (Sandbox Code Playgroud)
唯一的问题是它调用字符串对象析构函数,它不应该这样做.任何帮助表示赞赏.
编辑:我不能使用placement new,因为我正在开发内核级别.