让我说我有一些东西。
char *ptr = malloc(sizeof(char *));
ptr = "AB";
ptr就像0x08123412
所以现在我想做点什么。
char *addr = "0x08123412";
如何从addr中取回AB。
请假设地址不会同时改变。
答案 0 :(得分:2)
char *ptr = malloc(sizeof(char *));
ptr = "AB";
这是内存泄漏,因为您丢失了malloc()
返回的地址,并且无法将该地址发送到free()
。
char *addr = "0x08123412";
虽然我无法理解你在这里要完成的任务,但这是有效的。无需拨打malloc()
。请注意,此代码声明了一个char
指针,并将其指向字符串" 0x08123412"。
要取回以前使用过的地址,您需要将其保存在某处。这就是为什么你不能覆盖你的指针值。如果以后需要它们,你需要坚持下去。
答案 1 :(得分:0)
char *ptr = malloc(sizeof(char *));
ptr = "AB";
char *addr = "0x08123412";
现在让我们用这个替换最后一条指令:
char *addr = 0x08123412;
这可能是你的意思,它更有意义。
所以我们走了:
首先,您编写了malloc(sizeof (char *))
,您可能打算编写malloc(sizeof (char))
,因为根据此代码,您将分配一个指向char的指针,而不是char,希望malloc返回一个指向void的指针,这将是隐含的投入你声明的char *ptr
。
下一条指令:ptr = "AB"
。这里发生的是编译器将分配" AB"作为字符串文字可能在.rodata部分。 ' PTR'将保留" AB"放了。
到现在为止,这是你的内存布局:
ptr lives at address X // &ptr = X
"AB" lives at address Y // &("AB") = Y
ptr contains Y // ptr = Y
现在malloc返回的地址,你说是0x08123412,让我们称之为Z,是malloc()分配的内存位置的地址,你在分配" AB&#34时丢失了;到ptr。但假设你把它放在某处,你仍然无法触及" AB"用它。达到字符串的唯一方法" AB"是知道它的地址,而现在,唯一可以帮助你的是ptr,因为它仍然保存着那个地址。覆盖它和" AB"永远失去了。