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

如何在C语言中为静态数组赋值?咨询memcpy重设fields数组的方法

数组重新赋值的实现方法(含memcpy用法及更优方案)

问题描述

需要指导如何使用memcpy为数组fields重新赋予新值,同时希望了解更优的重新赋值方式。示例代码如下:

#include <stdio.h>
#include <string.h>

#define array_size(array) sizeof(array)/sizeof(array[0])

struct user_profile {
    const char *first_name;
    const char *second_name;
    unsigned int age;
};

int main() {
    struct user_profile fields[] = {
        {"david", "hart", 32},
        {"billy", "cohen", 24},
    };
    
    for (int i = 0; i < array_size(fields); ++i) {
        printf("%s %s\n", fields[i].first_name, fields[i].second_name);
    }
    
    memcpy(fields, {{"zach", "roberts", 59}, {"mike", "fisher", 19}}, sizeof(fields));
    return 0;
}

解决方案

1. 修正memcpy的用法

你的代码里memcpy的第二个参数写法不合法,C语言中不能直接用{{...}}作为指针参数传递。需要用复合字面量显式声明数组类型,让编译器识别为指针:

// 修正后的memcpy调用
memcpy(fields, (struct user_profile[]){{"zach", "roberts", 59}, {"mike", "fisher", 19}}, sizeof(fields));

复合字面量会生成一个临时的结构体数组,memcpy会把这个临时数组的内容完整拷贝到fields中,注意拷贝字节数要和目标数组大小一致(sizeof(fields)),避免越界或拷贝不完整。

2. 更优的赋值方式

(1)逐个元素直接赋值

如果数组元素数量不多,直接给每个元素赋值的可读性更好,无需依赖memcpy:

fields[0] = (struct user_profile){"zach", "roberts", 59};
fields[1] = (struct user_profile){"mike", "fisher", 19};

这种方式直观清晰,不需要计算内存大小,也不会出现拷贝错误。

(2)使用临时数组中转

如果新值需要复用,或者元素较多,可以先定义一个临时数组,再拷贝或循环赋值:

struct user_profile new_fields[] = {
    {"zach", "roberts", 59},
    {"mike", "fisher", 19}
};
// 方式一:memcpy拷贝
memcpy(fields, new_fields, sizeof(fields));
// 方式二:循环赋值(适合需要额外处理每个元素的场景)
for (int i = 0; i < array_size(fields); ++i) {
    fields[i] = new_fields[i];
}

临时数组的方式代码可读性高,调试也更方便。

(3)注意事项

  • 结构体中first_name和second_name是const char*类型,赋值时拷贝的是字符串指针而非字符串内容。如果后续这些字符串字面量被修改(即便声明为const也要注意风险),会影响所有引用它们的结构体。若需要独立的字符串副本,需额外用strdup或手动分配内存拷贝字符串。
  • 数组名不能直接作为左值赋值(比如fields = new_fields;是非法的),因为数组名是指向首元素的常量指针,无法被重新赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:15:52