首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在指定的初始值设定项中复制数组

在指定的初始值设定项中复制数组
EN

Stack Overflow用户
提问于 2013-11-22 08:15:03
回答 2查看 301关注 0票数 2

我正在尝试使用指定的初始值设定项来初始化const struct。但是,其中一个struct元素是固定宽度的数组。我已经在另一个大小合适的固定宽度数组中拥有了要用来初始化数组的内容。

有没有办法用一个指定的初始化器来做到这一点?下面演示了我试图实现的一个简单(失败的示例)。

代码语言:javascript
复制
struct foo {
    uint8_t array1[4];
    uint8_t array2[4];
}

uint8_t array[4] = {
    1, 2, 3, 4
};

struct foo const bar = {
   .array1 = array,     // incompatible pointer to integer conversion
   .array2 = { *array } // only copies the first element
};
EN

回答 2

Stack Overflow用户

发布于 2013-11-22 08:37:57

简而言之:不能。C不复制数组(不使用(标准库-)函数)。警告来自这样一个事实,即您不能将数组作为一个整体赋值,即使它们是静态的或常量的。当一个数组被用作赋值中的r值时,它会衰减为一个指针,因此不能(作为一个整体)赋给另一个数组。

最简单的方法是使用memcpy,但显然它必须在函数中。

票数 1
EN

Stack Overflow用户

发布于 2013-11-22 09:33:03

如果bar具有全局作用域,或者被声明为static,那么您将不能使用指定的初始化器从非立即值进行初始化,而不管相关的成员是否为数组。

但是,如果:

  1. bar是在某个函数的堆栈上声明的,
  2. 您的固定大小的数组实际上只有4个元素,

那么你也许可以用下面这样的方式逃脱惩罚:

代码语言:javascript
复制
#include <stdio.h>
#include <stdint.h>

struct foo {
    uint8_t array1[4];
    uint8_t array2[4];
};

#define ARRAY_INIT(a) { a[0], a[1], a[2], a[3] }

int main (int argc, char **argv) {
    uint8_t arr_init[4] = {
        1, 2, 3, 4
    };
    struct foo const bar = {
        .array1 = ARRAY_INIT(arr_init),
        .array2 = ARRAY_INIT(arr_init),
    };
    printf("%d, %d\n", bar.array1[0], bar.array2[3]);
    return (0);
}

初始值设定项数组必须出现在堆栈帧中要初始化的值之前。或者它可能来自一个函数参数。

当然,如果您的数组比这个数组大得多,那么使用这样的宏确实会变得非常混乱。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20134563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档