指针只是指向了空间,指针指向的空间不合法,导致操作出现问题
指针只要定义,必须初始化
自定义数据类型地址访问
对于连续空间里,保存的都是字节,而且这些字节都代表一个符号,称为字符空间
字符空间:约定了一个特殊的结束标志,以值0作为结束标志
非字符空间:空间中所有数值都能够表示具体含义,没有结束标志,
常量空间:“abc\101”
变量空间:
“ ”:常量地址
char arr1[] = "123456\101"
C语言发现这句话是初始化语句,主动调用C的库函数strcpy来完成两个空间的拷贝
如果在裸机系统开发中,编译器没有标准C库支持,这句话会在链接出错(自行编写拷贝函数来解决)
strlen(arr1)=7
sizeof(arr1)/sizeof(arr1[0])=8
防止:内存泄漏、内存溢出、野指针、栈溢出
字符空间头文件:include<string.h>
strlen(a):以a为首地址,逐个统计里面的字符个数,直到遇到0值结束
strlen("")=0
sizeof("")=1
char arr2[] = {'a','b','c'},
strlen(arr2)=未知(遇到\0结束计数)
sizeof(arr2)/sizeof(arr2[0])=3
stecpy(a,b):以b为首地址,将b区域的每个字节拷贝到a空间里,直到b中出现了0,0值也拷贝到a里
debug:调试--设置断点--查看内存信息
C语言 把连续的空间 分离处一个特殊空间 -- 字符空间
1、字符空间 c 约定了特殊的结束标志
2、提供了一系列的c支持的接口来操作字符串
strlen
strcpy
%s:以后面的值为地址,从这个地址开始,逐个字节进行符号解析,ASCII,解析到0为止(注意空间范围)
3、字符空间处理方法:逐一思想
可以根据0标志决定是否结束遍历
编写strlen函数
int myStrlen(const char *str){
int i = 0;
while(str[i]){
i++;
}
printf("%d\n",i);
return i;
}
char *p;
char *s;
两个地址的运算:+/-常量
地址1-地址2 == (地址1的数值-地址2的数值)/该地址的每个元素的大小==这两个元素的个数
int myStrlen2(const char *str){
const char *tmp = str;
while(*tmp){
tmp++;
}
return ( tmp-str );
}
禁止使用函数:strcpy()、gets()
字符空间处理 不能依赖于系统默认的结束标志,出现内存溢出,再结合空间的个数来双重限制(使用strncpy)
strncpy()编写:需要考虑结束标志
char *p;
strncpy( buf , p , sizeof(buf)-1 );
buf[ sizeof(buf) - 1 ] = 0;
char *strncpy(char *dest, const char *src, size_t n){
size_t i;
for( i=0; i<n && src[i] != '\0'; i ++ ){
dest[i] = src[i];
}
for( ; i<n; i++){
dest[i] = '\0'
}
return dest;
}