字符数组指针和整数类型转换(内存地址)



好的,目前我正在写一个内核,为了我的简历。在编写我的内存管理单元时,我遇到了瓶颈。

int address = (int)malloc(sizeof(Test))
consoleWriteString("Variable Address:n");
consoleWriteInteger(address);
char* f = (void*)address;
consoleWriteString("nVariable Address:n");
consoleWriteInteger((int)&f); // Should print off the same as above

逻辑上两者的输出应该是相同的。但有些地方出了问题。因为我的输出如下所示:

Variable Address: 47167
Variable Address: 1065908

经过长时间的测试和调试,我最终屈服并决定请求堆栈溢出。此外,如果您发现任何语法错误,请忽略它们。顺便说一下,这都是在C中,所有的函数都是自定义的,包括malloc,但我已经确定错误不在于该函数,或任何其他的事实。我相信这只是我在指针和类型转换方面的愚蠢,但不要嘲笑我,因为我错过了一些非常简单的东西。

由于yall

&ff的地址,而不是其中包含的地址!f在堆叠上。它的值(您第一次打印的地址)指向已分配的内存。

这样想:你在内存中为一些东西分配了空间。这个内存区域有一个地址。您将地址放在一个指针(f)中,以便它指向该区域。但是f本身需要在内存中的某个位置来保存该地址的值。在这种情况下,f在堆栈上,&f获得f(原始地址的容器)的地址,而不是f包含的地址。

作为题外话,要非常小心地将地址转换为int(和返回!),因为int可能不足以容纳地址(例如在x86-64上,取决于您的编译器)。我认为,当您想使用地址作为整数时,正确的类型是stdint.h中的uintptr_t

f(恰好是指针)的address(也是指针,但类型不同)相同-这是您在

行中所做的操作
char* f = (void*)address;
然后打印f: 的地址
consoleWriteInteger((int)&f);

这与f的不一样…将该行改为

consoleWriteInteger((int)f);

你应该都准备好了

第一个输出是int型,尽管malloc返回的是一个地址,第二个是一个地址强制转换为int型。做f代替&给你一个值的地址,而*解引用一个指针,让你得到什么是指向的值。

最新更新