今天看系统程序设计的时候看到一个程序,思来想去感觉最后的结果跟自己想的不太一样.后来终于弄明白了,现在贴上:
#include <stdio.h> void Initialize (char * a, char * b) { a[0] = 'T'; a[1] = 'h'; a[2] = 'i'; a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's'; a[7] = ' '; a[8] = 'A'; a[9] = '\0'; b = a; b[8] = 'B'; } #define ARRAY_SIZE 10 char a[ARRAY_SIZE]; char b[ARRAY_SIZE]; int main(int argc, char * argv[]) { Initialize(a, b); printf("%s\n%s\n", a, b); return 0; } |
原来,这个函数传递进去的参数是一个基础类型指针类型,那么其实传递到函数栈中的是ab数组首地址的一个复制品,那么在函数体中其实都是些临时变量.b=a是将b数组首地址的一个复制的临时变量赋值为a数组的首地址的一个复制的临时变量.这个时候对b进行操作,其实是对a数组进行操作,但是b数组的实际首地址是没有发生任何变化的,因为穿进去的只是b数组的一个复制品,所以当程序从这个函数体中推出的时候,b数组的首地址还是原来的首地址,那么它之后的内存单元中的值当然是没有发生任何变化的,都是被值为零的.
但是这个程序的用意明显是对ab数组同时进行初始化,那么这个该怎么做呢?当然是进行深复制.也就是说我们不能改变数组的首地址,而是直接根据复制的临时中间变量来对数组单元进行操作,从而改变数组中的内容.改写后的程序如下所示:
void Initialize (char * a, char * b) { int i; a[0] = 'T'; a[1] = 'h'; a[2] = 'i'; a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's'; a[7] = ' '; a[8] = 'A'; a[9] = '\0'; for (i = 0; i < ARRAY_SIZE; i++) { b[i] = a[i]; } b[8] = 'B'; }