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

时间:2013-05-31 03:56:16

标签: c pointers memory-management memory-address

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

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

3 个答案:

答案 0 :(得分:2)

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

以这种方式思考:你在内存中为某些东西分配空间。该存储区域具有地址。您将地址放在指针(f)中,以便指向该区域。但是f本身需要在内存中的某个位置才能保存该地址的值。在这种情况下,f位于堆栈中,&f获取f(原始地址的容器)的地址,而不是f包含的地址。< / p>

顺便说一句,要非常小心地将地址转换为int(并返回!),因为int可能不足以保存地址(例如,在x86-64上,具体取决于您的编译器) )。我相信当您想要将地址用作整数时使用的正确类型是uintptr_t中的stdint.h

答案 1 :(得分:1)

f的(恰好是指针)与address(它也是指针,但属于不同类型)相同 - 这就是你要做的在行

char* f = (void*)address;

然后你打印f:

地址
consoleWriteInteger((int)&f);

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

consoleWriteInteger((int)f);

你应该全力以赴。

答案 2 :(得分:0)

第一个print out是一个int,虽然malloc返回一个地址,第二个是一个转换为int的地址。而f代替&获取值的地址,而*取消引用指针,获取指向的值。