从指针数组中删除元素

时间:2013-05-22 17:08:00

标签: c pointers

我有一个程序,我需要使用指针数组。我的问题是我不知道如何从指针p(p [i])中删除元素i。我将详细说明下面的问题。

我有结构:

struct CuttingLine
    {
        NxU32 linePoints[150];
        NxU32 lineLength;
        NxVec3 normal;
    };

然后我声明指针:

CuttingLine* cuttingLines; 

我像这样初始化指针:

cuttingLines = (CuttingLine*)malloc(sizeof(CuttingLine) * 10);

然后我添加了一些元素(请注意,这仅用于演示目的,在我的程序中,行创建并给定值):

for(int i=0;i<3;i++)
    cuttingLines[i] = line;

然后我想再次通过指针,删除三个元素,但不释放指针(我知道你可以通过调用free(cuttingLines)来删除指针)。 我怎样才能做到这一点?我只想删除其中的元素,但不要释放开头分配的内存。

2 个答案:

答案 0 :(得分:1)

因为cuttingLines是指向CuttingLine的指针,所以您的循环实际上是在{3}中的每个位置执行line的结构副本。无需删除这些深层副本。完成后,您只需要不再使用该信息,并注意cuttingLines变量包含未使用的数据。然后,您可以在以后重复使用cuttingLines变量(用新行填充)。

答案 1 :(得分:1)

对我来说,看起来你想拥有一个指针数组,并动态分配数组的元素。在这种情况下,您需要将指针的值设置为NULL,这意味着指针不指向任何内容。像这样:

cuttingLines[i] = NULL;

这意味着“我的数组中有一个指针,但它没有指向任何东西”。

但是,如果您没有释放内存(通过调用free(cuttingLines[i])),则会出现内存泄漏,因此请记住稍后在程序中释放内存。为此,您需要在某处指定另一个指针,指向每次调用malloc的任何内容。

只是迂腐:你不能释放一个指针(除了在使用malloc分配例如sizeof(CuttingLine*)的意义上);你可以释放内存,所以调用free(ptr)可以释放指针所指向的内存。此外,您将cuttingLines视为指针数组,即指针指针,因此其类型应为CuttingLine**,您可以通过以下方式声明和分配:

CuttlingLine** cuttingLines;
cuttingLines = (CuttingLine**)malloc(sizeof(CuttingLine*) * 10);

另外,你不应该转换malloc的返回值(参见here),除非你正在编写C ++,在这种情况下你不需要首先使用指针指针。


另一方面,如果你想要一个CuttingLines数组,那么你正确地分配cuttingLines意义上的正确轨道,你不需要释放个人使用的内存CuttingLine。但是在这种情况下,你不知道数组中的哪些元素是有效的,哪些不是有效的,除非你跟踪代码中的索引或元素本身中的索引。将lineLength设置为0并检查其值。