我正在观看有关如何使用memcpy()
和strdup()
进行通用交换的视频讲座。
通用交换代码如下:
void GenericSwap(void* ptr1, void* ptr2, int size){
char buf[size];
memcpy(buf,ptr1,size);
memcpy(ptr1,ptr2,size);
memcpy(ptr2,buf,size);
}
我们称之为:
char* h = strdup("fred");
char* w = strdup("wilma");
GenericSwap(&h,&w,sizeof(char*));
printf("h : %s\nw : %s\n\n",h,w);
这将“fred”和“wilma”换成了整个字符串。也就是说,h指向“wilma”,w现在指向“fred”。
但是,当我将代码更改为:
char h1[10] = "fred";
char w1[10] = "wilma";
GenericSwap(&h1,&w1,sizeof(char*));
printf("h1 : %s\nw1 : %s\n",h1,w1);
我为h1
和w1
获得了“wilm”和“freda”。我正在传递包含数组第一个元素地址的东西的地址,就像顶部正确的工作代码一样,但这并不像顶级代码那样好用。
关于h1
和w1
只是指针,而不是指向指针的东西吗?
答案 0 :(得分:3)
您正在尝试更改阵列的地址,而这是您无法做到的。数组变量充当const
指向其数据的指针,无法更改。
相反,您正在交换第一个sizeof (char *)
(系统上似乎是4)字符。
基本上是
char h[8] = "foo";
这两个陈述
printf("%p\n", (void *) h);
和
printf("%p\n", (void *) &h);
将打印相同的地址,即表达式&h
计算到第一个元素的地址,就像h
一样。没有单独的变量保存数组的地址,供您更改。