Objective c 如何附加到C数组的末尾

Objective c 如何附加到C数组的末尾,objective-c,c,arrays,pointers,Objective C,C,Arrays,Pointers,我已经在objective-c中编程了一段时间,但不幸的是,我从未深入研究过c和内存指针,尽管我对它们有初步的了解。我正在使用一个CLLocationCoordinate2D结构数组,并试图找出如何附加到数组中。首先,我得到了 NSString *aString; //a bunch of coordinates CLLocationCoordinate2d *coordinates; int length; doSomethingCool(aString, &coordinates,

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

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

doSomethingCool(aString, &coordinates, &length);
在我做了一些很酷的事情之后,我想把它保存在一个类变量中。如果我只是做一些像

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

points = malloc(sizeof(CLLocationCoordinate2D) * length);
points[0] = *newPoints;
点以不同于新点的内容结束


最终,我的目标是能够基于长度附加到点,但是如果我不能让上面的代码工作,我就不能这样做。我做错了什么?

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


编辑:我刚意识到你在使用C,而不是C++。忽略第二部分。

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


编辑:我刚意识到你在使用C,而不是C++。忽略此项的后半部分。

您的代码只需将
新点的第一个值
复制到
点的第一个值中(
*新点
相当于
新点[0]

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

int* newvals = malloc(sizeof(int) * newcount);
memcpy(newvals, vals, sizeof(int) * oldcount);
free(vals);
vals = newvals;
您还可以使用
realloc
——它的行为类似于上述(尽管它可能会失败!),但有时可能更有效


请注意,您无法以安全、可移植的方式更改底层指针的大小。您需要使用新指针更新实例(“类”)变量。

您的代码只需将
新点的第一个值
复制到
点的第一个值(
*新点
相当于
新点[0]

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

int* newvals = malloc(sizeof(int) * newcount);
memcpy(newvals, vals, sizeof(int) * oldcount);
free(vals);
vals = newvals;
您还可以使用
realloc
——它的行为类似于上述(尽管它可能会失败!),但有时可能更有效


请注意,您无法以安全、可移植的方式更改底层指针的大小。你需要用新的指针更新你的实例(“类”)变量。< /P> <代码> NSMutableArray <代码>,在这种情况下,不要把C++带入它。我认为这个问题最好只依靠C中可用的内容来回答。因此,我没有将其标记为Objective-C(尽管其他人这样做了)。我错了吗?<代码> NSMutableArray <代码>,在这种情况下,我们不把C++带入其中。我认为这个问题最好只依靠C中可用的内容来回答。因此,我没有将其标记为Objective-C(尽管其他人这样做了)。我错了吗?这对C如何处理内存来说很有意义!因此,根据您的示例,如果我想将数据附加到newvals,像“memcpy(newvals[oldcount+1],vals,sizeof(int)*oldcount)”这样的东西是否有效?对于代码的性能、可维护性和可读性,我建议使用realloc,正如OP所指出的那样。realloc btw的一个典型缺陷是您:malloc(100*sizeof(int))想要增加到200并执行realloc(100*sizeof(int)),但realloc的总和不足以完成此操作,您需要realloc(200*sizeof(int))。作为边节点,malloc也可能失败。@我自己:close,它应该是“memcpy(&tempvals[oldcount],vals,sizeof(int)*oldcount);free(newvals);newvals=tempvals;”,记住数组的第一个值是0;因此,“&tempvals[oldcount]”而不是“&tempvals[oldcount+1]”感谢您的提示Eduard;一旦我弄明白了使用memcpy的语法应该是什么,realloc就让事情变得简单多了。这让C如何处理内存变得非常有意义!因此,根据您的示例,如果我想将数据附加到newvals,像“memcpy(newvals[oldcount+1],vals,sizeof(int)*oldcount)”这样的东西是否有效?对于代码的性能、可维护性和可读性,我建议使用realloc,正如OP所指出的那样。realloc btw的一个典型缺陷是您:malloc(100*sizeof(int))想要增加到200并执行realloc(100*sizeof(int)),但realloc的总和不足以完成此操作,您需要realloc(200*sizeof(int))。作为边节点,malloc也可能失败。@我自己:close,它应该是“memcpy(&tempvals[oldcount],vals,sizeof(int)*oldcount);free(newvals);newvals=tempvals;”,记住数组的第一个值是0;因此,“&tempvals[oldcount]”而不是“&tempvals[oldcount+1]”感谢您的提示Eduard;一旦我弄明白了使用memcpy的语法应该是什么,realloc就让事情变得简单多了。