今天看系统程序设计的时候看到一个程序,思来想去感觉最后的结果跟自己想的不太一样.后来终于弄明白了,现在贴上:
#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';
}
本文探讨了一个C语言程序中关于指针和数组的有趣现象:通过指针赋值修改数组内容时的不同结果,并详细解释了原因。文章最终提供了一种解决方案——深拷贝,以确保两个数组独立且内容相同。

被折叠的 条评论
为什么被折叠?



