博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言中字符数组和字符串指针分析
阅读量:5929 次
发布时间:2019-06-19

本文共 1722 字,大约阅读时间需要 5 分钟。

hot3.png

#include
#include
#include
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和new区别:

1、malloc是libc中一个函数,需要include stdlib.h,否则gcc会报错;而new是C++关键字,不依赖于头文件;

2、new可以返回指定类型的指针,并可以自动计算所需大小。malloc则必须由我们计算字节数,并在返回时强行转换为实际类型的指针。

字符数组和字符串指针的区别:

原型: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);

在 char day[15] = "abcdefghijklmn"; 这个语句执行的时候,系统就分配了一段长15的内存,并把这段内存起名为day,里面的值为"abcdefghijklmn",如下图所示:
 

&day:day这个变量的内存地址,即a字符的地址;&day[0]:同样为a字符地址;day:使用变量名来索引变量中的内容,理解为指针,同样为a字符的地址;

关于字符串指针str,在执行char* str = "opqrstuvwxyz"后内存的图示如下:内存分配了两段内存,一个名为str,类型是一个字符指针,另外一段是一个字符串常量,且str里面存放着字符常量的首地址,注意这里无法通过str修改这段字符串,因为是常量

 

&str:str这个字符指针的地址&str[0]:str所指字符常量第一个字符的地址 str:str这个字符指针的值,即字符串的首地址

转载于:https://my.oschina.net/u/347414/blog/187263

你可能感兴趣的文章
Java集合框架GS Collections具体解释
查看>>
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
查看>>
linux 笔记本的温度提示
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
快速排序——Java
查看>>
unity游戏与我
查看>>
187. Repeated DNA Sequences
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
基于事件驱动的DDD领域驱动设计框架分享(附源代码)
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
行列式的乘法定理
查看>>
linux下内存释放问题
查看>>