【问题标题】:How to assign values to the whole row of a dynamic two dimensional array?如何为动态二维数组的整行赋值?
【发布时间】:2010-10-02 17:07:54
【问题描述】:

我需要对一个坐标执行 9 种不同的操作,具体取决于坐标的位置。我有一个函数,它返回给定坐标(下、上、左、右或对角线)周围的位置坐标。 9 种不同的操作是不同可能的坐标“类型”;如果我正在处理坐标 (0, 0),则唯一有效的操作是右、右下和下。

我有一个结构,用于存储对每种坐标类型有效的方向。角坐标为 4,所有内部坐标为 1,边缘行的非角列为 4。

我存储所有方向的结构中的字段是一个名为“库”的动态二维数组。库的每一行都对应一种坐标类型,包含该类型坐标的所有有效方向。我还没有找到一种方法来一次分配一行的值,我不能用循环单独分配它们。

我试过的是:

searches->library[0][0] = {2, 3, 4, -1};
searches->library[1][0] = {4, 5, 6, -1};
searches->library[2][0] = {2, 3, 4, 5, 6, -1};
searches->library[3][0] = {0, 1, 2, 3, 4, 5, 6, 7, -1};
searches->library[4][0] = {0, 1, 2, -1};
searches->library[5][0] = {0, 6, 7, -1};
searches->library[6][0] = {0, 1, 2, 6, 7, -1};
searches->library[7][0] = {0, 1, 2, 3, 4, -1};
searches->library[8][0] = {0, 4, 5, 6, 7, -1};

但这给了我每行的p2AdjacencyMatrix.c:179: error: parse error before '{' token

我也试过了:

searches->library[][9] = {{2, 3, 4, -1},
                         {4, 5, 6, -1},
                         {2, 3, 4, 5, 6, -1},
                         {0, 1, 2, 3, 4, 5, 6, 7, -1},
                         {0, 1, 2, -1},
                         {0, 6, 7, -1},
                         {0, 1, 2, 6, 7, -1},
                         {0, 1, 2, 3, 4, -1},
                         {0, 4, 5, 6, 7, -1}};

结果它p2AdjacencyMatrix.c:189: error: parse error before ']' token

这是结构定义:

typedef struct{
    int active_length;  // Size of active array of searches
    int* active;        // Active array of searches
    int** library;  // Library of array of searches
} SearchLibrary;

以及动态数组的内存分配:

SearchLibrary* searches;
searches = (SearchLibrary *) malloc(sizeof(SearchLibrary*));
int search_cases = 9, search_directions = 9;
searches->library = (int **) malloc(search_cases * sizeof(int *));
searches->active = (int *) malloc(search_directions * sizeof(int));

int i;
for(i = 0; i < search_cases; i++){
    searches->library[i] = (int *) malloc(search_directions * sizeof(int));
}

如何将这些值添加到数组的每一行?我尝试将我的结构定义更改为静态数组,但这也不起作用。这是因为我使用了指向结构的指针吗?

【问题讨论】:

  • BUG HERE: 搜索 = (SearchLibrary ) malloc(sizeof(SearchLibrary));应该是 sizeof(SearchLibrary) !!!
  • 您能否解释一下为什么这是一个错误(以及后果是什么)?我必须以与程序另一部分结构的另一个指针类似的方式分配内存,否则程序会崩溃。不过我没有尝试 sizeof(SearchLibrary),所以我明天去试试。
  • 您想为 SearchLibrary 对象分配内存,但 sizeof(SearchLibrary *) 是指针大小或 4 字节(假设为 32 位拱形)。对象大小至少为 12。当您在“searches->”中填写值时,您将写入您分配的 4 字节小块,从而破坏内存。

标签: c arrays dynamic


【解决方案1】:

假设 C99,您可以在行上使用复合文字和 memcpy()。对于k-th 行,可能如下所示:

#define SEARCH_DIRECTIONS 9

memcpy(searches->library[k], ((int [SEARCH_DIRECTIONS]){ 1, 2, 3 }),
    sizeof(int) * SEARCH_DIRECTIONS);

【讨论】:

  • 我没有注意到这些数字最多代表 9 个方向。考虑到这一点,我认为您的答案更好(因此您不必进行动态分配)。 +1
  • 我必须阅读复合文字,看看我是否遗漏了一些明显的东西,但是在我的代码中使用这一行会产生这样的结果:警告:数组初始值设定项警告中的多余元素:(接近初始化for `(anonymous)') 用于复合文字中的每个元素。我明天再试试。
  • 您使用的是哪个编译器?如果是 gcc,您是否指定了 -std=c99(或 -std=gnu99)选项?
  • 是的,我正在使用 gcc 并尝试指定 -std=c99,但它仍然不喜欢它。我认为 c99 可能是默认标准,因为我尝试使用 c89 并且它抛出了更多错误。由于其他解决方案有效,我很乐意将其保留在此,除非它是我所缺少的非常简单的东西。谢谢
  • hm - 在此处编译...使用此解决方案,行的内容将在运行时计算,而使用 Die in Sente 的解决方案,它们必须在编译时知道。跨度>
【解决方案2】:
static const int Library0[] = {2, 3, 4, -1};
static const int Library1[] = {4, 5, 6, -1};
static const int Library2[] = {2, 3, 4, 5, 6, -1};
static const int Library3[] = {0, 1, 2, 3, 4, 5, 6, 7, -1};
static const int Library4[] = {0, 1, 2, -1};
static const int Library5[] = {0, 6, 7, -1};
static const int Library6[] = {0, 1, 2, 6, 7, -1};
static const int Library7[] = {0, 1, 2, 3, 4, -1};
static const int Library8[] = {0, 4, 5, 6, 7, -1};

static const int * Library[] = { 
    Library0, Library1, Library2,
    Library3, Library4, Library5,
    Library6, Library7, Library8,
};

typedef struct{
    int active_length;  // Size of active array of searches
    const int* active;                // Active array of searches
    const int** library;      // Library of array of searches
} SearchLibrary;

searches->library = Library;

编辑:修复语法错误。

【讨论】:

  • 你想念一些 [] 任何地方吗?
  • 我可能也缺少一些 const 限定符。
  • 我得到与其他解决方案相同的错误,所以我必须遗漏一些东西:警告:标量初始化程序警告中的多余元素:(“库”的接近初始化)
  • int * Library后面还少了一对[]
  • 感谢您发现我的语法错误,Chistoph -- 我不应该在早上喝咖啡之前这样做。
【解决方案3】:

在 C 中你不能这样做。没有数组字面量供你分配,只有数组初始化表达式。

我认为解决方案是简单地从坐标和字段的大小计算所需的值,据我的理解应该很简单。

此外,具有恒定大小的文字初始化值似乎违背了动态分配所有这些内容的观点。

还有:

  • 不要在 C 中强制转换 malloc() 的返回值
  • 不要在不需要时对类型使用 sizeof,例如搜索 = malloc(sizeof *searches);等等

【讨论】:

  • 是的,强制转换 malloc() 的返回值——它通常是必需的。是的,即使您不需要也使用 sizeof —— 它使您的代码更易于维护。
  • 在 C 中,您不必强制转换 malloc 的返回值。这样做通常会给你的代码添加无用的冗余(知道你分配给什么类型)。我同意忽略 sizeof 是个坏主意
  • 不,不要在 C 中强制转换 malloc:它返回一个 void *,它可以隐式转换为任何(非函数)类型的指针
  • 等等,他不建议省略 sizeof。他只是建议省略类型,并用表达式替换它。我认为这是一个很好的建议。
  • 我昨天在尝试解决这个问题时阅读了一些问题,并看到一些关于不强制返回 malloc 的 cmets,我会记住这一点,谢谢。明天我需要再考虑一下您的解决方案,该结构应该不必根据坐标计算方向
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 2017-07-07
  • 2017-01-29
相关资源
最近更新 更多