【发布时间】:2010-03-07 22:09:21
【问题描述】:
我有一个我制作的结构类型的指针。在程序启动时,它以 NULL 开始,然后我需要 malloc/realloc,因为我需要添加/删除这些结构,我只是要使用我的指针指向第一个结构并像数组一样移动它。
当我 malloc/realloc 时,我总是使内存中“数组”/区域的大小比它需要的大一。我这样做是为了可以将内存中的“最后一个索引”/区域设置为 NULL,这样我就可以说类似 while(指针!= NULL)的内容。
我收到错误:当我尝试使用以下行将 NULL 分配给内存数组/区域中的最后一个位置时,分配中的左值无效:
// Realloc remotelist by adding one to connrhosts
connrhosts++;
remotelist = realloc(remotelist, sizeof(rhost)*(connrhosts + 1));
(remotelist + connrhosts) = NULL;
我想我说的是:
- 是时候向我的数组添加一个新结构了,所以我会将 connrhosts 增加一个。
- 将指向 remotelist 的内存重新分配到一个新的内存区域,该区域是 connrhosts 的大小(我将使用多少个结构)以及一个额外的空间,以便我可以将其设为 NULL
- 将远程列表指向新的内存区域
- 使用我的指针 remotelist 并添加偏移量 connrhosts 现在将指向内存区域的最后一个索引并使该指针为 NULL。
据我所知(或感觉)我所做的一切都是正确的,但我一直在从事这个项目一段时间,并且我的印象是我有狭隘的眼光。我希望有一双新的眼睛来看看我的逻辑/代码,让我知道他们的想法和我做错了什么。再次感谢。 :D
编辑 - 我的部分问题是我认为我对指针可以做什么有误解。
这是我的结构:
typedef struct {
char address[128]; // Buffer that holds our address of the remote host
int port; // Port of the remote host
int conn; // FD to the connection of our remote host
int ofiles; // Open files associated with the remote host
} rhost;
我希望我能做的是循环遍历我的数组/内存区域,并说如果它不为 NULL,然后用它做点什么。所以我原来的循环语句是 while (NULL != remotelist)。现在我相信正在阅读响应和 cmets,因为我正在检查指针是否为空,所以这个逻辑是错误的?我应该检查指针指向的内存/结构区域是否为空?如果是这种情况,它应该类似于 while (NULL != *(remotelist + someoffset))?
我这样做是因为我的老师建议/在课堂上谈论它。
我对 remotelist 的初始声明/初始化是:rhost *remotelist = NULL;
【问题讨论】:
-
顺便说一句,你为什么在分配
++connrhosts然后使用connrhosts + 1?那个额外的+ 1的目的是什么? -
connrhosts 是我目前可以连接的远程主机数量。因此,在我的数组中,如果它是两个并且我没有执行 connrhosts + 1,我将只有两个索引,0 和 1,并且都将指向一个结构。我做了 + 1,所以我可以有三个索引,0、1 和 2,其中 0 和 1 指向一个结构,2 可以等于 NULL。这样我就可以有像 while (NULL != remotelist) 之类的语句
-
rhost 是一个结构体。 remotelist 指向的分配是这些结构的数组,而不是指针数组。您不能将结构设置为 NULL,因此您需要另一种方式来表示列表的结束。一种方法是让整数与计数保持一致,并将其与指针一起传递。另一种方法是使用 rhost 的一个字段作为“数据结束”标记,例如,如果
ofiles为 -1,则表示数组结束。您可以使用实际的以 NULL 结尾的指针数组。我不建议这样做:您必须单独分配它们。 -
如果我说类似 rhost **remotelist;然后 remotelist = realloc(remotelist, sizeof(*rhost)*(connrhosts + 1));那么我可以将这些指针设置为 NULL 吗?
-
你会的,但给你的只是一个指针数组。然后,您可以分别分配一些
rhost对象。不过是sizeof(rhost*),或者sizeof(*remotelist),而不是sizeof(*rhost)。
标签: c compiler-construction pointers compiler-errors