C语言数组初始化进阶



数组空间的初始化


char buf[10]=“abc”;
a=”Hello World”;


我们知道双引号里面的字符串是常量,系统为它们分配一个空间之后,企图将内存首地址赋值给数组名。我们前面已经说过,数组名存储的首地址不可以被改变,由于前面已经被初始化,数组名指向的地址已经确定,所以不能被再次赋值。


数组第二次的内存赋值只能对它们逐一赋值,如下:


buf[0]=’h’; buf[1]=’e’;  ……   buf[n]=’d’;  buf[n+1]=0; //结尾标志


字符拷贝函数的原则:内存空间和内存空间的逐一赋值的功能的封装。一旦空间中出现了结束标志0,函数就即将结束。


Strcpy:通过在终端里面键入man strcpy查看函数声明。这个函数声明的时候,源字符串是常字符串,目的字符串不是常量的字符串。这是符合常理的,毕竟我们拷贝这个字符串却是不需要改变它的值的。这个函数接收两个字符串指针,将源地址里面的内容逐一拷贝到目的地址,拷贝在遇到源字符串的结束标志0结束拷贝。


0.png


我们可以想象出一个strcpy函数的模板:


int i=0;
 while(src[i]!=’\0’) {
  dest[i] = src[i];  i++;
   }


随着硬件的升级,硬件已经能够帮助我们做一些事情,所以有些strcpy的代码里面会有一些汇编语言,汇编语言可以进一步提高函数的效率。所以如果我们在面试嵌入式开发工程师的时候,可能就会有面试官叫你写一个strcpy的标准函数,你可以将上面这个形式写出来,但是还要加上一句话,根据CPU的体系结构和能力不同,这段程序是可以优化的。等以后我们看到具体的CPU和内核之后,就明白了为什么这个strcpy不是我们想象的这么简单,我们只是能够猜测出它的目的,但是具体实现细节不一定就是上面的函数代码。


此时我们就可以简略的为buf赋值了。


strcpy(buf,”hello world”); //将hello world这个字符串拷贝到buf中,并自动在结尾加上结束标志0。


strcpy函数可能导致内存泄漏,如果有黑客使用一个很长的字符串作为源字符串拷贝到内存中,因为遇到源字符串的结束标志这个函数才会停止拷贝,它就有可能覆盖掉内存里面原来的数据,进而导致很多问题。在工程中我们是不允许使用这个函数的。我们使用的是strncpy这个函数,它提供了第三个参数,接受一个拷贝大小的值,这个时候只会拷贝这么多的字符,不会导致内存泄漏。



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

logo
© 2012-2016 www.maiziedu.com
蜀ICP备13014270号-4 Version 5.0.0 release20160127

秋招大聚惠,豪华礼包你领了吗?

客服热线 400-862-8862

回到顶部