3

我有一个程序,我需要在其中使用指针数组。我的问题是我不知道如何从指针 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) 来删除指针)。我怎样才能做到这一点?我只想删除其中的元素,而不是释放一开始分配的内存。

4

2 回答 2

1

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

于 2013-05-22T17:18:35.517 回答
1

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

cuttingLines[i] = NULL;

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

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

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

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

此外,您不应强制转换 malloc 的返回值(请参阅此处),除非您正在编写 C++,在这种情况下,您首先不需要使用指向指针的指针。


另一方面,如果您想要拥有一组切割线,那么您在正确分配的意义上是cuttingLines正确的,并且您不需要释放单个切割线使用的内存。但是在这种情况下,您不知道数组中的哪些元素是有效的,哪些不是,除非您通过例如设置lineLength为 0 并检查其值来跟踪代码中的索引或元素本身中的索引。

于 2013-05-22T17:29:50.357 回答