【问题标题】:swap elements in array using void pointer [closed]使用 void 指针交换数组中的元素 [关闭]
【发布时间】:2012-10-01 01:27:39
【问题描述】:

我需要写一个函数

void reverse(void *base, int nel, int width) 
{ 
    // ... 
}

其中base 是指向数组开头的指针,nel - 数组中的元素数,width 是每个元素的大小(以字节为单位)。

例如,如何交换数组的前两个元素?

【问题讨论】:

  • 你试过什么?
  • 提示:首先开始写void reverse(char *base, size_t nel, size_t width) { ... }。比将其转换为 void 指针类型。
  • 请贴出你目前写的代码。您有特定问题吗?你收到一个错误?行为不正确?
  • 题目的题目如何体现题目的内容?

标签: c function types


【解决方案1】:

借助width 值,您可以简单地使用memcpy(因为它是许多编译器的内置函数)。您还需要一个临时变量。

/* C99 (use `malloc` rather than VLAs in C89) */
#include <string.h>

void reverse(void *base, size_t nel, size_t width) 
{
    if (nel >= 2) {
        char *el1 = base;
        char *el2 = (char *)base + width;
        char tmp[width];

        memcpy(tmp, el1, width);
        memcpy(el1, el2, width);
        memcpy(el2, tmp, width);
    }
}

【讨论】:

  • 这不就是swap()吗?如果用例如调用5 个元素,它实际上不会将它们从我所看到的内容中颠倒过来。
  • 记住 char tmp[width] 是 gcc 特定的,即不是标准 C !
  • @unwind:据我所知,这是 OP 的问题(如何交换数组前两个元素的内容)。
  • @Neil:VLA 不是 C99 标准吗?
  • @Neil VLA 是 Kirilenko 提到的 C99 中的完美标准(参见第 6.7.5.2 节)
【解决方案2】:

如果你想要它类型通用,使用

void swap(void *base, int len, int width)
{
    void *p = malloc(width);

    memcpy(p,base,width);
    memcpy(base,(char*)base+width,width);
    memcpy((char*)base+width,p,width);

    free(p);
}

这将交换前 2 个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多