将静态数组分配给另一个数组

时间:2013-11-30 18:10:04

标签: c arrays

#include<stdio.h>

struct test_ {
    char *device_name;
    char *path_name;
};

typedef struct test_ test_t;

struct capabilities_ {
    test_t tab[3];
    int enable;
};

static test_t table[3] = {
    { "first",    "john"},
    { "second",    "mike"},
    { "third:",    "vik" },
};

int main()
{
    struct capabilities_ cap;
    //cap.tab = table; ???
    return 0;
}

我有一个带有值的静态数组,我希望将其分配/复制到table to cap.tab结构下的相同类型/大小的变量。你能帮忙怎么做?

3 个答案:

答案 0 :(得分:0)

你可以这样做:

memcpy(cap.tab, table, sizeof (test_t) * (sizeof(table) / sizeof(test_t)));

这与将字符串复制到另一个字符串时使用的机制相同。由于您已知表格大小,您可以这样做:

memcpy(cap.tab, table, 3 * sizeof(test_t));

复制字符的等效方法如下:

memcpy(str, str1, sizeof(char) * 4); // copy 4 of str1 into str

答案 1 :(得分:0)

要在运行时执行此操作,您可以使用user9000的方法,或类似的东西:

for (i = 0; i < 3; i++)
  cap.tab[i] = table[i];

或者,将选项卡转换为使用指向test_t的指针而不是test_t数组。

struct capabilities_ {
  test_t *tab;
  int enable;
};

int main()
{
  struct capabilities_ cap;
  cap.tab = table;
  printf("%s\n", cap.tab[1].device_name);
  return 0;
}

或者,如果您尝试在初始化时执行此操作,请使用以下方法之一:

struct capabilities_ cap = {
  {
    { "first",  "john" },
    { "second", "mike" },
    { "third:", "vik"  },
  },
  1
};

或者这个,

struct capabilities_ cap = {
  {
    table[0],
    table[1],
    table[2],
  },
  1
};

答案 2 :(得分:0)

如果要复制字符串,而不仅仅是指向字符串的指针,则需要为目标功能struct中的每个字符串分配内存。这是一种方法

    for (int i = 0; i < sizeof(table) / sizeof(test_t); i++)
    {
        size_t device_name_length = strlen(table[i].device_name);
        size_t path_name_length = strlen(table[i].path_name);

        size_t target_device_length = device_name_length + 1; // + 1 for null terminator
        size_t target_path_length = path_name_length + 1; // + 1 for null terminator

        cap.tab[i].device_name = (char*) malloc( target_device_length  );
        cap.tab[i].path_name = (char*) malloc( target_path_length );

        strncpy_s(cap.tab[i].device_name, target_device_length, table[i].device_name, device_name_length);
        strncpy_s(cap.tab[i].path_name, target_path_length, table[i].path_name, path_name_length);
    }

如果您不打算进行深层复制,可以使用user9000显示的浅复制机制将指针复制到字符串。

此外,如果您使用上述机制,如果您的功能超出范围且不再使用,请不要忘记free。)