#include<iostream> #include<string> #include<vector> using namespace std; char* getMe1() { char c[]="world1"; return c; }//无效指针,输出不肯定,c是函数getMe1中申请的一个临时变量,函数调用完后,其空间已经不存在。
char* getMe2() { char* b= "hello"; return b; }//虽然getMe2运行虽然不会出错,可是函数设计错误,由于“hello”是常量字符串,位于静态存储区,在程序生命运行期间内恒定不变,不管何时调用getMe2,它总返回一个“只读”内存块。
void getMe3(char **p,int num) { *p = (char*)malloc(num); }//函数getMe3中的p参数是指向指针的指针,若是是一级指针则会出现错误,不会申请到地址。
void getMe4(char *p,int num) { *p = (char*)malloc(num); }//运行错误,会致使内存泄露
void getMe5(int num) { char *p = (char*)malloc(sizeof(char*)*num); return p; }//返回动态申请的内存,只要不释放内存,即调用free,就可使用该段内存。
int main() { char *str1,*str2; str1 =getMe1(); str2 =getMe2(); char *str3=NULL; getMe3(&str3,100); char *str4=NULL; getMe4(str4,100); char *str5=NULL; str5=getMe5(100); strcpy(str5, "hello"); free(str5); return 1; }
一、malloc是libc中一个函数,须要include stdlib.h,不然gcc会报错;而new是C++关键字,不依赖于头文件; ios
二、new能够返回指定类型的指针,并能够自动计算所需大小。malloc则必须由咱们计算字节数,并在返回时强行转换为实际类型的指针。 shell
字符数组和字符串指针的区别: 数组
原型:extern void *malloc(unsigned int num_bytes);void free(void *ptr); 函数
int *pn = new int;//返回int*类型,分配大小为sizeof(int);使用delete pn; int *pnarr = new int[100];//返回int*类型,分配大小为sizeof(int)*100;使用delete []pnaar; int *pm = (int*)malloc(sizeof(int)*100);//分配100个整型存储单元,或100*4字节;使用 free(pm);
&day:day这个变量的内存地址,即a字符的地址; &day[0]:一样为a字符地址; day:使用变量名来索引变量中的内容,理解为指针,一样为a字符的地址;
关于字符串指针str,在执行char* str = "opqrstuvwxyz"后内存的图示以下:内存分配了两段内存,一个名为str,类型是一个字符指针,另一段是一个字符串常量,且str里面存放着字符常量的首地址,注意这里没法经过str修改这段字符串,由于是常量。 spa
&str:str这个字符指针的地址 &str[0]:str所指字符常量第一个字符的地址 str:str这个字符指针的值,即字符串的首地址