c - 在 C 中打乱泛型数组

标签 c arrays shuffle

我有一个指向结构的指针数组。

我尝试使用这个问题的第一个答案来尝试解决这个问题,但是我遇到了段错误:

Shuffle array in C

尝试这段代码后,我尝试使用这个函数进行洗牌:

static void shuffle(void *array, size_t n, size_t size) {
    void * aux;
    aux = malloc (size);

    if (n > 1) {
        size_t i;
        for (i = 0; i < n - 1; ++i) {

            size_t j = i + rand() / (RAND_MAX / (n - i) + 1);

            memcpy(aux, array[j], size);
            memcpy(array[j], array[i], size);
            memcpy(array[i], aux, size);
        }
    }
}

但是我得到了以下错误:

warning: dereferencing 'void *' pointer [enable by default]
error: invalid use of void expression

我收到此警告和错误 3 次:每个 memcpy() 一次。

编辑

我更改了代码,因为我试图使用这个新代码而不是旧代码。

最佳答案

你不能取消引用 void* 也不能在 C 中对其进行算术运算,因为它实际上是“指向未知类型对象的指针”,所以编译器不知道要做什么(一些编译器允许算术作为扩展,就好像它是 char*,但不要依赖它)。

因此:

将您的 void* 转换为 char* 并用它们代替。不要忘记对指针算法进行自己的缩放。
另外,memcpy 应该得到一个指针,而不是指向的对象,所以使用 +,而不是 []
旁白:请避免内存泄漏,释放您分配的任何内存。
最后,请注意 random() 可能具有很小的范围和糟糕的统计属性。
最后+1:chux answer dissects the range-mapping used in this case ,显示它做得有多糟糕。

How to Debug Small Programs
C99 with Technical corrigenda TC1, TC2, and TC3 included

关于c - 在 C 中打乱泛型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23312276/

相关文章:

java - 防止发生错误时强行关闭

python-3.x - 如何在 python 中打乱带有标题的非常大的 .csv 文件?

arrays - 将变量添加到我的数组中

javascript - 尝试在 javascript 中以相同的方式洗牌多个数组?

python - 更好的方法来统一打乱两个 numpy 数组

c++ - 如何在 Visual Studio 中静态链接 FreeType2?

c - c语言如何将其转为大写

c - 指针如何知道项目的基础大小?

c - goto,跳转到 mmaped ELF 二进制文件的入口点

javascript - 在 Vue 模板中按类别组循环遍历产品项