如何在C中返回指向结构数组的指针?

如何在C中返回指向结构数组的指针?,c,pointers,struct,C,Pointers,Struct,我创建了一个函数,该函数用int填充结构的值,并应该返回指向同一结构的指针。但是,当我打印指针引用的内容时,它会打印垃圾值 这是我的密码: #include <stdlib.h> #include <stdio.h> struct Map * collect_values(int n, int *arr); struct Map{ int value, position; }; int main(){ int size, i; scanf("

我创建了一个函数,该函数用int填充结构的值,并应该返回指向同一结构的指针。但是,当我打印指针引用的内容时,它会打印垃圾值

这是我的密码:

#include <stdlib.h>
#include <stdio.h>

struct Map * collect_values(int n, int *arr);

struct Map{
    int value, position;
};

int main(){
    int size, i;
    scanf("%d", &size);
    int *arr = (int*) malloc(size*sizeof(int));
    struct Map *p = collect_values(size,arr);

    for(i = 0; i < size; i++){
        printf("%d : %d\n", p[i].value, p[i].position);
    }
    return 0;
}

struct Map * collect_values(int n, int *arr){
    int i, position = 0;
    struct Map array[n];
    for(i = 0; i < n; i++){
        scanf("%d",&arr[i]);
        array[i].value = arr[i];
        array[i].position = position;
        position++;
    }
    struct Map *ptr = &array[n];
    return ptr;
}

我尝试过使用
p[I]->value
,但它无法编译。我做错了什么?

结构是在本地声明的,因此在其作用域(即声明它的函数)结束后“死亡”,从而导致“垃圾”值

你也应该

  • 在调用者函数中本地创建结构,并将其(按地址)传递给填充函数
  • 在filling函数中使用malloc创建结构,返回它的指针,并在完成后在调用者函数中释放它

  • 我将尝试查找重复项,但您返回的是指向局部变量的指针
    结构映射*ptr=&数组[0]@psinout第一个是类型错误,第二个没有解决问题(返回指向局部变量的指针)。@melpomene找到重复的吗?我还是不知道该怎么修。我不确定哪个结构是超出范围的局部变量。是数组[n]?还是ptr?它们都是在collect values函数中本地创建的。顺便说一下,您返回的是一个不存在的元素的地址
    array
    具有
    n
    元素,因此有效索引的范围为
    0
    n-1
    &数组[n]
    是数组末尾一个元素的地址。
    array
    ptr
    都是局部变量,在函数返回时消失,但是
    return ptr
    意味着返回了
    ptr
    的副本,所以这部分没有问题。但是,此指针指向数组的一个元素,该元素已不存在,这就是问题所在。我发现了重复的;如果他们没有显示给你,请滚动到顶部(或者重新加载页面)。你介意更明确一点吗?对于第二个选项,我想我之所以想做,是因为我想保持我的主方法精简(我实际上要将该指针发送到另一个函数,但我想先看看它是否会打印出来),我应该在collect_values()中执行类似的操作:struct Map*ptr;ptr=malloc(sizeof(结构映射));返回ptr;然后免费在主要的方法?但是如果我从来没有说过要指向数组[n]结构,它怎么知道要指向它呢?@Rahme你不应该有一个
    数组[n]
    (顺便说一下,它是数组,不是结构)<代码>数组
    作为本地数组是整个问题的关键所在。相反,您应该执行
    structmap*array=calloc(n,sizeof*array)。。。返回数组然后在
    自由(p)当您使用完它后。假设我将*p从main传递到另一个函数来对结构进行排序。我是否也在该函数中释放内存?还是仅仅在主要方面?我什么时候需要释放内存?释放应该只发生一次,当你用完内存时。一个好的做法是从分配内存的函数中执行此操作(但如果从其调用者/被调用者执行此操作,则也会工作,尽管更难理解)
    
    -485221568 : 32766
    -1529319768 : 32767
    24 : 48
    -485221520 : 32766
    -485221776 : 32766
    32766 : 0
    872480919 : -968757580
    0 : 0
    0 : 0
    0 : 0