通用交换"字符串"在C.

时间:2015-01-19 13:08:53

标签: 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* 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);

我为h1w1获得了“wilm”和“freda”。我正在传递包含数组第一个元素地址的东西的地址,就像顶部正确的工作代码一样,但这并不像顶级代码那样好用。

关于h1w1只是指针,而不是指向指针的东西吗?

1 个答案:

答案 0 :(得分:3)

您正在尝试更改阵列的地址,而这是您无法做到的。数组变量充当const指向其数据的指针,无法更改。

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

基本上是

char h[8] = "foo";

这两个陈述

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

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

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