文档章节

C语言中字符数组和字符串指针分析

SibylY
 SibylY
发布于 2013/12/24 19:23
字数 715
阅读 168
收藏 13
点赞 0
评论 5
#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和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这个字符指针的值,即字符串的首地址






本文转载自:http://www.cnblogs.com/gigikouyi/archive/2006/08/01/464737.html

共有 人打赏支持
SibylY
粉丝 29
博文 410
码字总数 327499
作品 0
海淀
程序员
加载中

评论(5)

SibylY
SibylY

引用来自“ericsoul”的评论

另外,lz不知道是我手机问题还是怎么的,你的程序结果截图,和后面的文字有关系么?

我是不懂为什么str1的输出是乱码。
ericsoul
ericsoul
另外,lz不知道是我手机问题还是怎么的,你的程序结果截图,和后面的文字有关系么?
ericsoul
ericsoul

引用来自“中山野鬼”的评论

str2不会是也指针。哈。 实际程序,getMe2 中返回的b,这个变量是寄存器变量,简单说,把"hello"的地址读取到寄存器里,而这个寄存器有个特定功能,就是用于存放返回值。在随后的str2 =getMe2();这个语句,这个寄存器里的值会保存在str2这个空间里。哈。

嗯,现在的情况是,“hello”是局部域函数getme2中的常量字符串。局部域的生命周期应该在函数执行完就over了。难道因为它是常量字符串所以存储在常量区里,编译时就占好了位置,程序运行期间不会被回收了,也就是说getme2执行返回的地址值永远是一样!
中山野鬼
中山野鬼
str2不会是也指针。哈。 实际程序,getMe2 中返回的b,这个变量是寄存器变量,简单说,把"hello"的地址读取到寄存器里,而这个寄存器有个特定功能,就是用于存放返回值。在随后的str2 =getMe2();这个语句,这个寄存器里的值会保存在str2这个空间里。哈。
ericsoul
ericsoul
@中山野鬼 求指点,lz的第一个程序,getme2反回的str2能打印正确是因为程序不够庞大吧。str2其实算是野指针吧?还是因为hello是常量,在常量区,编译时,就在存储了,不会因为是局部变量而回收?

暂无文章

DUBBO 详细介绍

摘要: 主要核心部件: Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制. RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能 Registry: 服务目录框架...

明理萝
10分钟前
0
1
4 个快速的 Python 编译器 for 2018

简评:Python 和其他的解释型语言一样经常被吐槽性能不行,所以开发人员为了提升性能创建了不少编译器,本文则选取其中的四个做了基准测试。 Python 其实是一种相当快的语言,但它并不像编译...

极光推送
13分钟前
0
0
spring boot注册多个MQ服务器的问题

关于注册到多个MQ源的文章已经有很多了,这里记录一下声明queue的坑; 如果使用注册bean的方式声明queue,会导致声明的queue同时被注册到所有的MQ源上; //如果使用下面的声明方式,que...

placeholder
14分钟前
0
0
Java面试基础篇——第九篇:BIO,NIO,AIO的区别

现在IO模型主要分三类:BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO()。 先来看看BIO。 1. BIO 服务端接受到请求后,要指派或新建一个线程去处理客户端的IO请求,直到收到断开连接的指令。这么做...

developlee的潇洒人生
19分钟前
0
0
@RequestMapping @ResponseBody 和 @RequestBody 用法与区别

1.@RequestMapping 国际惯例先介绍什么是@RequestMapping,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为...

特拉仔
21分钟前
1
0
基于 HTML5 结合互联网+ 的 3D 隧道

前言 目前,物资采购和人力成本是隧道业发展的两大瓶颈。比如依靠民间借贷,融资成本很高;采购价格不透明,没有增值税发票;还有项目管控和供应链管理的问题。成本在不断上升,利润在不断下...

xhload3d
23分钟前
0
0
济南小程序热度分析

原文链接:http://www.jnqianle.cn/company/2072.html

tianma3798
24分钟前
1
0
大数据软件

beats 采集 kafka spark hive es grafana zeppelin

ArlenXu
26分钟前
0
0
Mac item2常用快捷键

标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 command + 左右方向键 切换全屏:command + enter 查找:command + f 分屏 水平分屏:command + d 垂直分屏:c...

说回答
30分钟前
0
0
mac常用软件

1.excel for mac http://www.pc6.com/mac/114205.html

小黑202
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部