如何在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
相关产品推荐
相关产品推荐

