文档章节

由strcat函数引发的对char *a和char a[]以及sizeof和strlen

小师life
 小师life
发布于 2016/07/03 09:18
字数 472
阅读 4
收藏 0

/*

*  char *a = "Hello";Hello存放在常量区,是无法修改的。

通过指针只可以访问字符串常量,而不可以去改变它

*  char a[] = "Hello";而数组存放在栈中,是可以修改的

*  Hello存放在栈中,可以通过指针去访问和修改数组内容

*

sizeofstrlen两个函数的随想:

sizeof的参数是数组,返回的是编译时分配的数组空间 sizeof是运算符,值在编译时已计算好)

strlen的参数是字符型指针(char *),当数组名作为参数传入时,实际上数组就退化为指针了。

strlen是函数,值需要在运行时才能得出)

该函数的实际功能从代表字符串的第一个地址开始遍历,知道遇到结束符'\0',返回长度不包括'\0'

 

这也就说明下面的函数为什么会将数组越界的字符串也一起显示了,strlen的限制就只是'\0',而

且数组传入后即退化为指针,指针只是在读这些地址的值,没有修改,所以也不“违法”。

 

总的来说就是,数组可以越界,编译器也不会报警,至于越界使用的地址会造成什么,谁也不知道

 

char *a= "Hello, ";
char b[]= "World!";
 
strcat(b, a);     //  这样是可行的,但是将b和a互换位置后,将导致段错误
                 a是常量,不可被更改
 
printf("%s",b);
 
*/
#include<stdio.h>
#include<string.h>
 
voidstrcat(char a[], char b[]);
intstrlen(char *s);
 
intmain()
{
int i = 0;
char a[] = "Hello, ";
char b[] = "World!";
 
strcat(a, b);
 
printf("%d\n", strlen(a));
printf("%d\n", sizeof(a));
 
printf("%s", a);
return 0;
}
 
voidstrcat(char a[], char b[])
{
int i = 0, j = 0;
 
while(a[i] != '\0')
i++;
 
while( (a[i++] = b[j++]) != '\0' );
}
 
intstrlen(char *s)
{
char *p = s;
 
while(*p != '\0')
p++;
 
return p-s;
}


© 著作权归作者所有

小师life
粉丝 0
博文 32
码字总数 6965
作品 0
武汉
程序员
私信 提问
C语言通过串口发送AT指令

以下代码是通过串口发送AT指令: atcmd.c: #include #include #include "atcmd.h" static HANDLE hCom; static char com_name[32] = {0}; static int BaudRate; FILE *fp; int AT_ComOpen() ......

qiang_guozky
2016/06/08
0
0
从printf谈可变参数函数的实现

从printf谈可变参数函数的实现 一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒。printf这种对参...

IMGTN
2012/11/13
72
1
C语言中文分词改错,初学,希望大家可以教教我?

char segmentsentence(char s1[200]){ //逆向最大匹配法 char s2[200]={" "}; while(s1[0]!=0){ int len=(int)sizeof(s1); if(len>Maxwordlength){ len=Maxwordlength; } char w[200]; strnc......

凉拌菜
2013/04/24
306
3
sizeof与strlen的区别

char str[20]="0123456789"; int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。 int b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间......

晨曦之光
2012/03/09
264
0
小蚂蚁学习C语言(33)——C语言字符串

字符串常量 字符串常量是由双引号括起来的一串字符,如“ABC”。在存储字符串时,系统会自动在其尾部加上一个空值“0”,空值也要占用一个字节,也就是字符串“ABC"需要占用四个字节。但不计入...

嗜学如命的小蚂蚁
2016/01/13
64
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.2K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部