指针传递内存
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) *num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100);
strcpy(str, "hello");
}
运行的时候会蹦,书上说str没有获得期望的内存,求解释!
[解决办法]
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void GetMemory(char **p, int num)
{
*p = (char *)malloc(sizeof(char) *num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
}
动态内存不能返回的
[解决办法]
str等于空,传给p相当于给p初始化了,但是在GetMemory中,又重新申请了一块空间给p,那p指向这块内存,跟str又没有关系。大概不恰当的比喻,比如A,B同住一个房间,突然B自己买了一个房子,搬走了,这跟A有什么关系呢???
[解决办法]
因为函数调用时的参数传递一般都是“值传递”,你传入一个指针str,在调用时系统先创建一个临时指针p,然后把str的值(指向NULL)赋给p,也就是他两指向同一个地址(NULL),然后p = (char *)malloc(sizeof(char) *num);
这句就让p指向了新开辟的内存地址,所以,传入的实参str的值并没有改变,还是NULL,所以...
如果要让指针str获得开辟的内存地址,必须传入指针str的地址(双指针),就像1楼的方法
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
不要写连自己也预测不了结果的代码!