1

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

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

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

mf myArr[1000];

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

4

4 回答 4

3

你是对的。前者分配 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 开始的原因。

于 2013-03-04T05:01:51.297 回答
1

你似乎理解正确。

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

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

于 2013-03-04T05:08:15.913 回答
1
typedef struct myfiles mf;
mf* myArr[1000];

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

于 2013-03-04T05:03:10.100 回答
0
typedef struct myfiles mf;
mf* myArr[1000];

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

于 2013-03-04T06:42:58.463 回答