You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

表达式必须可修改错误:未知类型数组元素交换实现问题

解决void*数组交换元素的"Expression must be modifiable"错误

错误原因

  • void*是无类型指针,编译器无法确定数组元素的字节大小,因此不能直接通过base[i1]这种下标操作计算元素的内存地址。
  • 即使忽略地址计算问题,base[i1]的结果是void类型,这是不完整类型,既不能被赋值,也不能作为右值存储到变量中,这就是触发“表达式必须可修改”错误的核心原因。

正确实现方案

要实现未知类型数组的元素交换,必须额外传入元素的字节大小,通过字节级的内存拷贝完成交换操作。

基于变长数组的实现(C99及以上支持)

#include <string.h>

void exchange(void *base, size_t elem_size, int i1, int i2) {
    // 转换为char*指针,以字节为单位计算元素地址
    char *elem1 = (char *)base + i1 * elem_size;
    char *elem2 = (char *)base + i2 * elem_size;

    // 用变长数组作为临时缓冲区存储元素内容
    char aux[elem_size];
    memcpy(aux, elem1, elem_size);
    memcpy(elem1, elem2, elem_size);
    memcpy(elem2, aux, elem_size);
}

基于动态内存分配的实现(兼容C89标准)

如果编译器不支持变长数组,可以用malloc分配临时缓冲区:

#include <string.h>
#include <stdlib.h>

void exchange(void *base, size_t elem_size, int i1, int i2) {
    char *elem1 = (char *)base + i1 * elem_size;
    char *elem2 = (char *)base + i2 * elem_size;

    char *aux = (char *)malloc(elem_size);
    if (aux == NULL) {
        // 内存分配失败,可根据需求添加错误处理逻辑
        return;
    }

    memcpy(aux, elem1, elem_size);
    memcpy(elem1, elem2, elem_size);
    memcpy(elem2, aux, elem_size);
    free(aux);
}

调用示例

以交换int数组的元素为例:

int arr[] = {10, 20, 30, 40};
exchange(arr, sizeof(int), 1, 3); // 交换arr[1]和arr[3]

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:15:40