【问题标题】:Array of pointers to struct in CC中指向结构的指针数组
【发布时间】:2013-03-04 14:42:58
【问题描述】:

我的 c 代码中有一个大约 300Bytes (5xint + 256chars) 的结构,我希望有一个好的数组机制来处理我的这个结构的所有“对象”。 我想要一个全局指针数组,这样一开始数组中的所有索引都指向NULL,但是当我需要它时初始化每个索引(malloc)并在我完成时删除它(免费)。

typedef struct myfiles mf;
mf* myArr[1000];

这就是我要找的吗?与数组混合的指针经常让我感到困惑。 如果是这样,只是为了澄清,是否

mf myArr[1000];

已经在堆栈上分配了 1000 个结构,而我的第一个建议只分配了 1000 个指针?

【问题讨论】:

    标签: c struct


    【解决方案1】:

    你是对的。前者分配 1000 个指针,没有一个被初始化,后者初始化 1000 个对象,每个对象约 300 字节。

    初始化为空:foo_t* foo[1000] = {NULL};

    但这仍然很愚蠢。为什么不只是mf* myArr = NULL?现在您有一个指向未初始化内存的指针,而不是 1000 个指向已初始化内存的指针和一个要跟踪的指针。你愿意吗

    myArraySingle = malloc(sizeof(mf)*1000);

    for(int i = 0; i < 1000; i++) {
        myArray[i] = malloc(1000);
    }
    

    并通过myArraySingle[300] 或 *(myArray[300])` 访问?无论如何,我的观点是除了语法之外,不要创建这种不必要的间接。单个指针可以指向包含一系列对象的连续内存块,就像数组一样,这就是为什么指针支持数组样式语法以及数组索引从 0 开始的原因。

    【讨论】:

    • 谢谢。是否可以依赖于我的第一个建议中的所有指针都是 NULL,或者它指向内存中的任意位置?
    • 最好在数组上做一个memset,保证所有的指针,都指向NULL。
    • @e-r-a-n 查看编辑,因为我认为 C99,您可以在一行中完成此操作。
    • 为什么傻?我想对我的数组有一个干净的开始,因为我想传达一个事实,即其中的一个点要么为空,要么为结构存储一个位置
    【解决方案2】:
    typedef struct myfiles mf;
    mf* myArr[1000];
    

    这就是你要找的。这将为结构 mf 分配 1000 个指针的数组。

    【讨论】:

      【解决方案3】:

      你似乎理解正确。

      更准确地说,我相信mf* myArr[1000] = { 0 }; 会更好地满足您的要求,因为您需要保证所有元素都将被初始化为空指针。如果没有初始化,则不存在该保证。

      C 中没有“全局”。您指的是具有静态存储持续时间的对象,在文件范围内声明。

      【讨论】:

        【解决方案4】:
        typedef struct myfiles mf;
        mf* myArr[1000];
        

        是的,它将初始化 1000 个指针,您必须在使用前使用 malloc/calloc 为每个指针分配内存。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-16
          • 1970-01-01
          • 2017-06-03
          相关资源
          最近更新 更多