如何附加到C数组的末尾

时间:2011-06-26 04:35:45

标签: objective-c c arrays pointers

我已经在objective-c中编程了一段时间,但遗憾的是我从未深入研究过C和内存指针,尽管我对它们有一些基本的了解。我正在使用一组CLLocationCoordinate2D结构,我正在试图找出如何附加到数组。首先,我得到了

NSString *aString; //a bunch of coordinates
CLLocationCoordinate2d *coordinates;
int length;

doSomethingCool(aString, &coordinates, &length);

在我做了一些很酷的事情之后,我想把它保存在一个类变量中。如果我只是做一些像

这样的事情
points = newPoints

points 包含适当的内容。但是,如果我尝试做这样的事情:

points = malloc(sizeof(CLLocationCoordinate2D) * length);
points[0] = *newPoints;

积分最终会有与 newPoints 不同的内容。

最终我的目标是能够根据长度附加积分,但如果我无法获得,我将无法做到这一点上面的代码工作。我做错了什么?

2 个答案:

答案 0 :(得分:7)

您的代码只是将newPoints的第一个值复制到points的第一个值(*newPoints相当于newPoints[0])。

一种情况是创建一个新数组,复制所有值,切换数组,以及释放旧数组。例如:

int* newvals = malloc(sizeof(int) * newcount);
memcpy(newvals, vals, sizeof(int) * oldcount);
free(vals);
vals = newvals;

你也可以使用realloc - 它的行为类似于上面的行为(虽然它可能会失败!),但有时可能会更有效率。

请注意,您无法以安全便携的方式更改基础指针的大小。您需要使用新指针更新实例(“class”)变量。

答案 1 :(得分:0)

这个想法是将所有数组复制到一个临时数组中,调整原始大小,然后将它们复制回来。然而,管理这个可能会变得多毛。你最好使用std :: vector并添加它。

编辑:我刚刚意识到你正在使用C,而不是C ++。无视这一半的后半部分。