以上代码中,会出现字符串被截断的情况:
当在代码中写⼊字符串常量“ABC”,则该字符串常量被计算为⼀个字符指针(char *),其指向字符串的第⼀个字节。也即,下⾯代码中
因为指针的运算依赖于指针指向的类型,所以不能对void类型的指针进⾏运算操作。
以及打印的结果:
对于字符型,参考下⾯的例⼦:
sizeof是⼀个很特殊的操作符。在编译程序之前,编译器会将它替换掉,因为在编译时,这些值就能确定。
char str1[] = "will be 11";
char* str2 = "will be 8";
sizeof(str1) //11 because it is an array
sizeof(str2) //8 because it is a pointer
所以,sizeof在编译时就被优化掉了。
11. 进⼀步理解指针和数组
以下两段代码,哪⼀段是正确的?
int* f1(int *p) {
*p = 42;
return p;
} // This code is correct;
以及
char* f2() {
char p[] = "Hello";
return p;
sizeof 指针} // Incorrect!
原因是,数组保存的字符串保存在栈上,因此,当函数返回时,栈已经撤销,地址⽆效。⽽指针指向的常量⼀般保存在静态值区域,⼀直保留。下⾯的代码可以正确:
char* f4() {
static char p[] = "Hello";
return p;
} // OK
此时,明确指定数组中存放的值是static的,因此,它在程序⽣命期间都有效,这个地址⼀直是有效的。
static的理解可以参照这篇。
12. 字符串拷贝
下⾯这段代码的问题?
void mystrcpy(char*dest, char* src) {
// void means no return value
while( *src ) { dest = src; src ++; dest++; }
}
上⾯的代码中,仅仅是将dest指向了src,因此,dest指向的内存处得内容并没有发⽣变化。同时,上⾯代码也没有拷贝null字节。
改进代码如下:
while( *src ) { *dest = *src; src ++; dest++; }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。