C 将结构数组分配给指针

C 将结构数组分配给指针,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,我初始化了一个结构数组(只包含一个名为name的字符字符串)。然后将此结构数组分配给指针,如下所示: location locations[2] = {{"Padstow", 50.5384, -4.9378}, {"Newquay", 50.412, -5.0757}}; int location_size = 2; location *loc_ptr; loc_ptr = &locations[0]; // pick an e

我初始化了一个结构数组(只包含一个名为
name
的字符字符串)。然后将此结构数组分配给指针,如下所示:

location locations[2] = {{"Padstow", 50.5384, -4.9378}, 
                         {"Newquay", 50.412, -5.0757}};

int location_size = 2;

location *loc_ptr;
loc_ptr = &locations[0];

// pick an element to remove
location element = loc_ptr[1];

remove_element(loc_ptr, location_size, element);
然后,我将此指针传递到一个函数中。在此函数中,我将删除数组的一个元素。这是通过迭代当前数组并创建一个新数组来完成的。新数组包含我期望的数据

remove_元素
功能中:

void remove_element(location *ptr, int count, location element) {

    // create the new array
    location new_locations[count-1];

    // go through and pick out the non-matching element

    // create the new pointer        
    location *new_ptr;
    new_ptr = &new_locations[0];

    // assign the new array to the original pointer
    ptr = new_ptr;
}    

但是,它没有更改原始数据。您能解释一下我将此新数组分配给原始指针的错误做法吗?

您如何从函数返回新数组

如果要更改数组所在的地址,则需要一个双指针(指针指向指针)

这行不通:

void f(location *l)
{
   // changing the array here:
   l = malloc(5*(sizeof(location));
   // add new stuff to l
}

int main()
{
    location *loc_ptr;
    loc_ptr = &locations[0];
    f(loc_ptr); // won't change address loc_ptr's is pointing to.
}
如果您有:

struct location a;
struct location b;

a = b;
您将把
b
中的数据复制到
a

您似乎正在执行以下操作:

struct location *a;
struct location *b;

a = b;
这会将
b
的指针复制到
a
;而不是数据

你的意思可能是:

*ptr = *new_ptr;
new\u ptr
指向的数据复制到
ptr
指向的位置

ptr = new_ptr;
我假设
ptr
是函数的参数。您实际做的是覆盖堆栈上的值(指针本身的值),这不会更改函数外部指针的值。您可以传回新指针,或将指向“location”的双指针作为参数,然后执行以下操作:

*p_ptr = new_ptr;

我已经有一段时间没有用C语言做任何事情了,所以我有点生疏了,但我会尝试一下

我认为有(至少)两种方法可以让它工作:或者从函数返回新数组的新指针,并将其存储在旧指针中,比如(这可能在语法上不正确):


loc_ptr=一些功能,用于创建以太网和转接点(loc_ptr);

另一种可能是通过指针而不是通过值将loc_ptr传递给函数作为函数中的参数,指针指向您的loc_ptr。在函数中,您从指针指向的指针中取消对数组memoryaddress的引用以访问原始数组。创建并填充新数组后,将新数组的内存地址放入指针传递的参数中

>我编辑了两种方法的快速示例,这实际上是C++,但我确信99%,指针在C中工作相同(如果它有点冗长),请注意,数组没有被释放到任何地方,因此这会导致内存泄漏(但您应该得到按值传递的指针与指针的关系):

#包括
#包括
结构位置
{
std::字符串名;
双lat;
双离子;
};
位置*createNewArrayAndReturnPointer(位置*loc)
{

std::cout name如果希望通过
location
变量反映对数组的更改,则需要直接就地修改该数组。如果希望对数组的副本进行所有更改,则可以,但必须循环整个数组并将所有结构复制回第一个数组


请非常小心地保持数组长度不变,或者始终在某个永远不会增长的位置维护数组长度变量。C数组不会增长。您可以尝试使用
realloc(3)
来增长一个数组,但它可能会失败,并且必须使用
malloc(3)来分配原始数组
首先。如果你只是假装它们较短,它们可以缩小……)

我想你是在做一些

void f(location *loc_ptr)
{
   location *new_array = ...
   loc_ptr = new_array;
}

int main(void)
{
  location locations[2] = {...};
  location *loc_ptr = locations;
  f(loc_ptr);
  ...
}
如果是这样,解决办法是

void f(location **loc_ptr)
{
  location *new_array = ...;
  *loc_ptr = new_array;
}

int main(void)
{
  location locations[2] = {...};
  location *loc_ptr = locations;
  f(&loc_ptr);
  ...
}

如果要更改
loc_ptr
的值而不是
loc_ptr
所指向的值,则必须将指向该值的指针传递给函数。

但请注意,C没有通过单个赋值复制事物数组的机制。啊,是的,非常正确。这将只复制单个元素,而不是数组。请添加以下内容回答您的问题。您如何在函数中创建新数组?如何从函数返回创建的数组?如果您只发布函数的代码,将所有不相关的代码替换为简短的注释,如
//修改数组
。此外,您只提过一次
ptr
,但没有解释它在哪里刚开始的时候,你有代码> LooppPTR >代码。我在C的时候不会说“引用”。有人会把它和C++混淆。只是说“用指针”。函数是删除一个元素;所以我的意图是假装它们越来越小。
void f(location **loc_ptr)
{
  location *new_array = ...;
  *loc_ptr = new_array;
}

int main(void)
{
  location locations[2] = {...};
  location *loc_ptr = locations;
  f(&loc_ptr);
  ...
}