0

我是 C 的新手,但我目前正在做一个项目,但我无法弄清楚如何做需要做的事情。

我有 2 个不同的结构数组,它们的定义完全不同,我正在尝试执行与 PHP 的 array_pop 相同的操作,即删除数组结构的最后一个元素。

我知道我可以创建 2 个单独的函数,每个结构类型一个,但显然不是最好的主意,所以我想知道是否可以将任一结构类型传递给一个函数,可能还有一个标志和标志确定它应该被转换成什么类型​​的结构。

我的结构定义如下

typedef struct CallLogSearchResultStruct
{
    long date;
    int dRowIndex;
} callLogSearchResultStruct;

typedef struct CallLogSearchDataStruct
{
    char * date;
    char * time;
    char * bParty;
    char * aParty;
    float duration;
    char * cleardownCause;
    struct CallLogSearchOutboundStruct * outboundLegs;
} callLogSearchDataStruct;

以下是结构的初始化方式

callLogSearchData = calloc(numRows, sizeof(callLogSearchDataStruct));
callLogSearch = calloc(numRows, sizeof(callLogSearchResultStruct));

numRows是要包含在数组中的结构的数量。

以下是我如何使用这些结构

callLogSearchData[dataRow].aParty = NULL;
callLogSearchData[dataRow].bParty = NULL;
callLogSearchData[dataRow].cleardownCause = NULL;
callLogSearchData[dataRow].date = NULL;
callLogSearchData[dataRow].time = NULL;
callLogSearchData[dataRow].outboundLegs = NULL;

道歉,如果这是一个简单直接的答案,我在谷歌上找不到任何东西,虽然不完全确定这会被称为什么,所以也许我使用了错误的关键字。

感谢您的任何帮助,您可以提供。

4

3 回答 3

1

“删除”是什么意思?数组是如何分配的?

如果您有一个由声明创建的数组,例如:

struct foo my_foos[123];

您无法更改my_foos长度为 123 个元素的事实。您当然可以通过size_t foo_count维护一个单独的变量来选择忽略其中的一些。

C 中的数组通常不是动态的(与许多高级语言中的列表/数组不同)。您可以使用 来实现动态数组malloc(),这并不难,但不清楚这是否是您所做的。

于 2013-10-07T14:34:58.497 回答
0

如果您愿意使用外部文件,请查看utarray

它是存储在一个标题中的一组宏,允许您搜索。无需链接其他库,只需链接#include文件即可获得所需的内容。

您必须实现自定义UT_icd提供函数来初始化、复制和释放存储在数组中的元素。

于 2013-10-07T14:41:43.160 回答
0

你想要的实际上是一个链表。它是一组结构,每个都指向列表中的第 N 个元素和下一个元素。这样,您可以通过在链中取消链接来轻松删除任何元素。您可以在 C 中搜索链接列表库,或者实现一个(这是一个很好的练习)。C 中的数组是静态内存范围,只有足够的空间供您的元素使用。而已。一般来说,您不能删除一个元素。但是,您可以使用 realloc 函数来调整现有数组的大小。对于你想要做的事情,我会选择一个链接列表。

于 2013-10-07T15:05:35.093 回答