动态数组的使用:
通常因为在编译时无法知道数组的维数,所以才需要动态创建该数组。例如,在程序执行过程中,常常使用char *指针指向多个C风格字符串,于是必须根据每个字符串的长度实时地动态分配存储空间。采用这种技术要比建立固定大小的数组安全。如果程序员能够准确计算出运行时需要的数组长度,就不必再担心数组变量具
有固定的长度而造成的溢出问题。
关于动态数组的使用我们举一个例子:
比如,希望把字符串复制到另一个字符中。我在这里再次强调,尽管C++中使用的是string。我还是要掌握住Char数组的形式。所以在这里我先使用数组的形式。
char *src="abcd";
上面一句话的意思是,是src指向一个字符串。字符串的长度我们可以使用函数:strlen(src)来计算,可想而知,这个长度是4。它不包含字符串结束符''。下面我们定义一个目标字符串,仍然使用char指针的形式:
char *des;
我们很自然的想起函数strncpy(char *des, char *src, int len),意思是从原字符串复制len长度个数的字符到目标字符串。注意了,注意了,如果使用:strncpy(des,src,strlen(src)),这里会有两个错误,你知道吗?
第一个错误:
des没有使用new或malloc的方式分配内存空间,所以它实际上还是一个null。
第二个错误:
在改正第一个错误之后:
char *des=new char[strlen(src)];
strncpy(des,src,strlen(src));
首先是开辟了一个strlen(src)长度的内存空间,并且复制目标串。注意一下过程:
src在内存中状态为:
['a','b','c','d','']
我们在使用strlen(src)计算src长度的时候,得到的长度为4。
所以上面char *des=new char[strlen(src)];事实上开辟了4个字节的空间,而复制也是复制了4个字符,按道理来说是没有错误的。可是结果呢?我们使用cout<<res<<endl;输出结果却是abcd XXX 一段乱码。究其原因无论是C中还是C++中,字符串的结尾都是''。虽然我们申请了4个空间,但是却意外的被多复制
了几个未知字符。为了解决这个问题。
我们如下处理:
char *src="abcd";
char *des = new char[strlen(src)+1];
strncpy(des,src,strlen(src)+1);
这样就是多申请了一个结束符空间,并且在复制的时候,复制此结束符。红色为正确书写方式。一定要多加注意。