"string" 在 C 中的通用交换
Generic swapping of "string" in C
我正在观看有关如何使用 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);
我得到 "wilm" 和 "freda" h1
和 w1
。我正在传递保存数组第一个元素地址的东西的地址,就像顶部的正确工作代码一样,但这不像顶部那样工作得很好。
h1
和 w1
只是指针,而不是指针对指针?
您正在尝试更改数组的地址,但您不能这样做。数组变量充当 const
指向其数据的指针,无法更改。
相反,您要交换前 sizeof (char *)
个(在您的系统上似乎是 4 个)字符。
基本上是为了
char h[8] = "foo";
两种说法
printf("%p\n", (void *) h);
和
printf("%p\n", (void *) &h);
将打印 相同的 地址,即表达式 &h
的计算结果为第一个元素的地址,就像 h
一样。没有单独的变量保存数组的地址,供您更改。
我正在观看有关如何使用 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);
我得到 "wilm" 和 "freda" h1
和 w1
。我正在传递保存数组第一个元素地址的东西的地址,就像顶部的正确工作代码一样,但这不像顶部那样工作得很好。
h1
和 w1
只是指针,而不是指针对指针?
您正在尝试更改数组的地址,但您不能这样做。数组变量充当 const
指向其数据的指针,无法更改。
相反,您要交换前 sizeof (char *)
个(在您的系统上似乎是 4 个)字符。
基本上是为了
char h[8] = "foo";
两种说法
printf("%p\n", (void *) h);
和
printf("%p\n", (void *) &h);
将打印 相同的 地址,即表达式 &h
的计算结果为第一个元素的地址,就像 h
一样。没有单独的变量保存数组的地址,供您更改。