通过struct将整个数组分配到C中的另一个数组中

时间:2015-03-15 13:30:36

标签: c arrays struct

我是学生,我将在学校介绍阵列。我有这个代码,应该将整个数组分配到另一个数组。

#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;
}
  • 如何在实际项目中使用此技术?
  • 我能用这个做什么?
  • 有什么优点和缺点?

2 个答案:

答案 0 :(得分:3)

赞成

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

缺点

  • 作业很简单。编写最少的代码,编译器完成所有工作。
    可能并不明显这样的任务是相当昂贵的操作。当然比简单的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提出了改进命名惯例的问题。

答案 1 :(得分:1)

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

Sam说,你应该使用memcpy()。我唯一能想到的是代码性能。了解更多here