#include<stdio.h> #include<stdlib.h> void GetMemory1(char*p, int num) { p = (char*)malloc(sizeof(char)*num); } void GetMemory2(char**p, int num) { *p = (char*)malloc(sizeof(char)*num); } char* GetMemory3(char*p, int num) { p = (char*)malloc(sizeof(char)*num); return p; } char* GetMemory4(void) { char p[] = "hello world"; return p; } int main() { char* str1 = NULL; char* str2 = NULL; char* str3 = NULL; char* str4 = NULL;
GetMemory1(str1,100); GetMemory2(&str2, 100); str3 = GetMemory3(str3, "hellow"); str4 = GetMemory4(); //strcpy(str1, "hello"); //printf("%s ", str1); //无法输出,将str1的地址拷贝到p中,p虽然分配完内存空间, //但是在在函数结束时p被释放,str1只有一个空间,所以str1越界 /*strcpy(str2, "hello"); printf("%s ", str2);*/ //可以输出hello,因为传递的是&str2值(将str2的地址拷贝到给p) //函数执行完毕后,p虽然释放但是p指向的对象(str2)已经被分配完内存空间 /*strcpy(str3, "hello"); printf("%s ", str3);*/ //返回的地址,相当于拷贝给str3,所以str3实际已经有100个空间。 printf("%s ", str4); //输出乱码,因为函数执行完毕后,函数GetMemory4()中的数组空间 //被释放,所以str4这个指针指向的内容是乱码,vs2015编译器是 //烫烫烫,内存是cc cc cc cc cc cc cc cc 四个c对应中文烫 //与第三个GetMemory3()对比,因为malloc分配的内存空间再函数 //结束后如果不free是不会被释放的。所以可以输出hello。 system("pause"); }