【问题标题】:Assign whole array into another array in C via a struct通过结构将整个数组分配给C中的另一个数组
【发布时间】:2015-03-15 13:30:35
【问题描述】:

我是一名学生,我将在学校做一个关于数组的演讲。我有这段代码应该将整个数组分配给另一个数组。

#define MAX 10
#include <stdio.h>

typedef struct {
    int data[MAX];
} INT_ARR;

int main()
{
    int i;
    INT_ARR arr1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    INT_ARR arr2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    arr1 = arr2;

    return 0;
}
  • 如何在实际项目中使用这种技术?
  • 我能用这个做什么?
  • 有什么优点和缺点?

【问题讨论】:

  • 在实际编程中,您应该使用memcpy() 函数将一个数组的内容复制到另一个数组。或者可以使用malloc()/calloc() 动态分配数组,然后将一个数组的指针分配给另一个数组。取决于您的特定任务。
  • 能否请有足够声誉的人将此作为重复项关闭(例如):stackoverflow.com/q/4530319/694576stackoverflow.com/q/17500960/694576(我不小心敲错了答案... :-})
  • 您作为原件提供的两个问题都是不同的问题,@alk。这是在以这种特定方式进行数组分配时询问实际考虑因素。我在引用的问题中没有看到这种方法,这当然不是他们的主要话题。
  • @Palec:C 不允许分配数组(poleX = poleY; 根本无法编译)。所以我想知道“以这种特定方式进行数组分配时的实际考虑”应该是什么,如果不是我链接的答案中提到的“解决方法”。
  • @SamProtsenko 我经常看到人们只是不熟悉 C 的这种能力,这太糟糕了。实际上,它是一种基本的自动资源管理。此处的示例非常简单,但是对于具有简单字段和数组字段的更复杂的结构,这可能非常有用。

标签: c arrays struct


【解决方案1】:

优点

  • 作业很简单。您编写最少的代码,编译器完成所有工作。
    作为一名程序员,你很难犯错误——无论是在正确性还是性能方面。机器不会出错,编译器在优化方面比人类好得多。
  • 不需要函数调用。
    一般来说,函数调用很慢。有时优化器可以摆脱它们,但在保持代码可维护性的同时摆脱它们也不是坏事。
  • 当用作局部变量时,数组存储在堆栈中。
    分配很快,释放也很快。

缺点

  • 作业很简单。您编写最少的代码,编译器完成所有工作。
    这种分配是一项相当昂贵的操作可能并不明显。肯定比简单的 int 赋值更昂贵。混淆你未来的自己或项目的任何其他贡献者是不好的。
  • 输入 arr1.data[i] 比输入 arr1[i] 更烦人。
  • 当用作局部变量时,数组存储在堆栈中。
    因此它必须非常小。否则会出现堆栈溢出。
  • 与 C99 variable-length arrays 不同,这些数组的长度是在编译时定义的。
  • 你很少需要这个。
    具有赋值能力的固定宽度的小数组 en masse 在实践中并不是很有用。如果您遇到他们的实际应用程序,请在评论中@ping 我并附上它的描述,我会很感兴趣。

我想写更多关于最后一点的内容。

基本上你有一个固定 d 的 d 维向量,在编译时就知道了。如果 d 可以在程序的未来版本中更改,这可能很有用,但我想这是极不可能的情况,并且在这样的应用程序中,普通结构会更好。我所说的普通结构是指结构不仅用作单个数组的最小包装器;确保它们仍然可以包含一个数组作为成员。

您需要更多的是能够复制数组的各个部分并分别分配它们。 memcpy() 函数用于此目的。您甚至可以将它与结构内的数组一起使用,就像这个问题中的数组一样。

查看数组赋值的另一种方法是通过指针。有时你不需要有两个不同的内存块,你只需要一个名字。在这种情况下,您应该使用指向内存的指针,从而避免复制数组。指针赋值既快速又简单。

对代码的其他说明

  • 初始化器应该有双括号

    INT_ARR arr2 = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}};
    

    外层用于结构体,内层用于数组。

  • 在您的代码中,有一个未使用的int i。我猜这是测试您的代码时遗留下来的。
  • 在 C 中,您应该使用 int main(void) 而不是 int main()。后者是不推荐使用的语法,可能会在 C 的未来版本中删除。在函数声明(不是定义)中,空括号表示“我对参数没有说任何话”。使用它而不是明确的 void 可能会导致非常不愉快的意外。
  • 您应该选择更具描述性且最好是英文的标识符。即使你不是以英语为母语的人。因此,您使其他人能够与您合作。我edited你的问题是为了改进命名约定。

【讨论】:

  • 你没有提到的一个大专家是,通过= 分配不会出错;而使用memcpy 可能会复制错误的字节数或复制到错误的位置。
  • 在实际代码中,有很多成员的结构并不少见,其中一个(或多个)是数组;并按值复制该结构。
  • @Palec 在很多情况下,结构描述配置 - 没有什么限制配置仅限于非数组,它通常可以包含各种数据。
  • 谢谢,@MattMcNabb。我忘了提到分配的简单性使它显然是正确的。已编辑。
  • 我认为这个问题是关于只有一个成员的结构,它是一个数组类型,@MattMcNabb。明确表示。我相信通常还有其他关于结构中数组的问题。
【解决方案2】:

没有“一个真正的答案”。这取决于你想做什么。事实上,除了一些基础的学校项目,你可能不会在真正的编程中使用它。

正如 Sam 所说,您应该使用 memcpy()。我能想到的唯一缺点是代码性能。了解更多here

【讨论】:

  • 我强烈反对使用 memcpy 的建议;这应该是最后的手段,因为它很容易出错。
猜你喜欢
  • 2014-07-14
  • 2013-09-28
  • 2018-09-03
  • 2016-02-08
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多