#include#include #include void get_memory(char *p){ p = (char *)malloc(100); } int main(void) { char *str = NULL; get_memory(str); strcpy(str,"hello,world"); printf("%s\n",str); return EXIT_SUCCESS; }
面试时,面试官让我做3道题其中这一题我做错了.
我答了输出"hello,world"了.
当时我没有想通.现在我回到实验室,自己调试了一下.
调试过程如下:
在get_memory(str);中.str传递的是0x00过去.
.然后.p的值也是0x00.
这个肯定不成功,我以为是因为str初始化为NULL才这样的.
但是.当我给str初始化有东西时.如下:
int get_memory(char *p){ p = (char *)malloc(100); return 0; } int main(void) { char *str = "a"; get_memory(str); strcpy(str,"hello,world"); printf("%s\n",str); return EXIT_SUCCESS; } /*** 在eclipse中调试时一些变量 的值: 语句:char *str = "a"; 执行前: Name : str Details:0x28bff4 "|\\315\\025" Default:0x28bff4 "|\315\025" Decimal:2670580 Hex:0x28bff4 Binary:1010001011111111110100 Octal:012137764 执行后: Name : str Details:0x8048c0f "a" Default:0x8048c0f "a" Decimal:134515727 Hex:0x8048c0f Binary:1000000001001000110000001111 Octal:01001106017 语句 :p = (char *)malloc(100); 执行前: Name : p Details:0x8048c0f "a" Default:0x8048c0f "a" Decimal:134515727 Hex:0x8048c0f Binary:1000000001001000110000001111 Octal:01001106017 执行后: Name : p Details:0x8048c0f "a" Default:0x8048c0f "a" Decimal:134515727 Hex:0x8048c0f Binary:1000000001001000110000001111 Octal:01001106017
分析 char *p = (char *)malloc(100);语句时发现,malloc的调用对于p好像没有什么直接的影响.
我们换成在main函数中对str直接调用malloc试下,如下:
/** str = (char *)malloc(100); 调用前: Name : str Details:0x8048c0f "a" Default:0x8048c0f "a" Decimal:134515727 Hex:0x8048c0f Binary:1000000001001000110000001111 Octal:01001106017 调用之后: Name : str Details:0x804b008 "" Default:0x804b008 "" Decimal:134524936 Hex:0x804b008 Binary:1000000001001011000000001000 Octal:01001130010 **/
这是一个问题.为什么在参数中声明的char *p.在调用了malloc函数之后却没有反应呢?
面试的过程中,我还被问到一个问题,就是堆和栈的区别.