strlen()和sizeof的区别&数组和指针

您所在的位置:网站首页 sizeof字符数组首地址的 strlen()和sizeof的区别&数组和指针

strlen()和sizeof的区别&数组和指针

2024-01-10 00:48| 来源: 网络整理| 查看: 265

从入口参数接过来的数据最好定义个临时变量,做个缓冲,不要轻易修改原地址的值,要引进一个辅助的指针变量把形参接过来,很重要。一定要清楚指针在内存中的指向,不然会指向一个错误的地址。

void get(char *from, char *to) { char *myfrom = from; char *myto = to; }

strlen是函数,字符串长度,不包括停止符。而sizeof则是内存块的大小,包括停止符。 数组是一种数据类型,数据类型的本质就是固定大小,内存块的别名。可以用sizeof()一般都是数据类型。

int main() { char buf[] = "abcd"; printf("%d\n",strlen(buf)); printf("%d\n",sizeof(buf)); }

输出结果就是4,5

看下面的这个程序是错误的,buf是分配在全局区的,是个常量,是只读的,不允许被修改,buf是字符a的首地址。在c++中一般应定义为const类型。

int main() { char *buf = "abcd"; buf = buf+1;//error }

但是你可以这么写:一定要记住buf是个常量,它表示数组首地址。

int main() { char *buf = "abcd"; char *p = buf; p = p+1;//error }

/************************************ 字符串拷贝copy[i] = '\0';丢了,打印的时候不会停止,因为printf是遇到终止符才停止打印。下面是几个经典的字符串拷贝函数。 ************************************/如果copy被定义为*copy,程序是无法运行的,因为copy无法分配内存的,程序会卡掉。

int main() { char buf[] = "I am a c studer!"; char *copy ; printf("%p\n",copy); int i; for(i = 0; *(buf + i) != '\0';i++) { *(copy+i) = *(buf+i); } copy[i] = '\0'; printf("%s\n",buf); printf("%s\n",copy); } //(nil) //Segmentation fault (core dumped) int main() { char buf[] = "I am a c studer!"; char copy[64] ; int i; for(i = 0; *(buf + i) != '\0';i++) { *(copy+i) = *(buf+i); } copy[i] = '\0'; printf("%s\n",buf); printf("%s\n",copy); } #define _CRT_SECURE_NO_WARNINGS #include #include #include void main71() { char a[] = "i am a student"; char b[64]; int i = 0; for (i=0; *(a+i) != '\0'; i++) { *(b+i) = *(a+i); } b[i] = '\0'; //ÖØÒª printf("a:%s \n", a); printf("b:%s \n", b); system("pause"); return ; } void copy_str21(char *from, char *to) { for (; *from!='\0'; from++, to++) { *to = *from; } *to = '\0'; return ; } void copy_str22(char *from, char *to) { for (; *from!='\0';) { *to++ = *from++; // ÏÈ *to = *from; ÔÙfrom++, to++ } *to = '\0'; // return ; } void copy_str23(char *from, char *to) { while( (*to = *from) != '\0' ) { from ++; to ++; } } void copy_str24(char *from , char *to) { while ( (*to++ = *from++) != '\0') { ; } } void copy_str25(char *from , char *to) { //*(0) = 'a'; while ( (*to++ = *from++) ) { ; } } void copy_str25_err(char *from , char *to) { //*(0) = 'a'; while ( (*to++ = *from++) ) { ; } printf("from:%s \n", from); } int copy_str26_good(char *from , char *to) { //*(0) = 'a'; char *tmpfrom = from; char *tmpto = to; if ( from == NULL || to == NULL) { return -1; } while ( *tmpto++ = *tmpfrom++ ) ; //¿ÕÓïŸä printf("from:%s \n", from); } int main111() { int ret = 0; char *from = "abcd"; char buf2[100]; //copy_str21(from, buf2); //copy_str22(from,buf2); //copy_str23(from, buf2); //copy_str24(from, buf2); //copy_str25(from ,buf2); //printf("buf2:%s \n", buf2); system("pause"); return ret; }

 

字符串aaaa首先会在全局区分配内存,然后再进行一个到栈区的拷贝工作。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3