通過函數給實參分配內存,可以通過二級指針實現
#include<stdio.h> #incldue<stdlib.h>void getheap(int *p) //錯誤的模型 {p = malloc(100); }void getheap(int **p) //正確的模型 {*p = malloc(100); } int main() {int *p =NULL;getheap(&p);free(p);return 0; }
如果出現以下錯誤:
test.c:6:7: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
? *p = malloc(100);
是因為沒有加上#include<stdio.h>的頭文件。
?
以下的方法也是可以的
int *getheap() //正確的方法 {return malloc(100); }int main() {int *p =NULL;p = getheap();free(p);return 0; }
?
下面的寫法是錯誤的:
char *getstring() //錯誤的寫法 {char array[10] = “hello”;return array; } int main() {char *s = getstring();printf(“s = %s\n”,s);return 0; }
原因是:
char array[10] = “hello”;? //棧變量,在函數調用結束之后便被釋放掉了
?
下面方法返回結果可行:
#include<stdio.h>char *getstring() {char *p = NULL;p = "string";return p; }int main() {char *p = NULL;p = getstring();printf("p = %s\n",p);return 0; }
?
不涉及到內存分配:
char getstring() //正確的寫法 {char c = ‘a’;return c; } int main() {char c= getstring();printf(“c = %c\n”,c);return 0; }
是正確的。
?
下面的寫法也是可以的
const char *getstring() //正確的 {return “hello”; } int main() {const char *ss = getstring();printf(“ss = %s\n”,ss);return 0; }
常量在靜態區,一直有效,直接返回地址是允許的。
可以將常量的地址返回值返回
或者:
char *getstring() //函數可以正確返回 {static char array[10] = “hello”; //在靜態區域return array; } int main() {char *s = getstring(); }
?