“的通用交换”;“字符串”;在C中

“的通用交换”;“字符串”;在C中,c,pointers,generics,swap,C,Pointers,Generics,Swap,我正在看一个关于如何使用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

我正在看一个关于如何使用
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指向“威尔玛”,w指向“弗雷德”

但是,当我将代码更改为:

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
仅仅是指针,而不是指向指针的指针吗?

您试图更改数组的地址,但您无法更改。数组变量充当指向其数据的
const
指针,不能更改

相反,您正在交换第一个
sizeof(char*)
(在您的系统中似乎是4个)字符

基本上是为了

char h[8] = "foo";
两种说法

printf("%p\n", (void *) h);


将打印相同的地址,即表达式
&h
计算为第一个元素的地址,就像
h
一样。没有保存数组地址的单独变量可供您更改。

ok!那么,假设在一个允许数组地址改变的编译器中,'&h'方法会给出正确的答案吗?正如“strdup()”方法所给出的那样?@Somjit这样的编译器不会编译编程语言C,所以我当然不知道。@解开OP试图更改哪个数组的地址的位置?@Somjit并非所有用途,不是。
sizeof&h
sizeof h
做不同的事情,例如。这取决于上下文。@Somjit我想你是说
h
char
数组。例如,
charh[1024]
,表达式
sizeof h
将计算为
1024
,但
sizeof&h
将与
sizeof(char*)
相同,即通常为4或8。两个表达式
h
&h
的数值将是相同的,但
sizeof
知道其中的差异。
printf("%p\n", (void *) &h);