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