【问题标题】:How do I return a pointer to an array of struct in C? [duplicate]如何在 C 中返回指向结构数组的指针? [复制]
【发布时间】:2018-09-13 05:32:04
【问题描述】:

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

这是我的代码:

#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;
}

我正在从文件中流水线化值,因此 scanf() 工作正常,并且我已经从 collect values() 打印,所以我知道它正在正确创建结构。

但是,当我从 main 方法打印时,输出是:

-485221568 : 32766
-1529319768 : 32767
24 : 48
-485221520 : 32766
-485221776 : 32766
32766 : 0
872480919 : -968757580
0 : 0
0 : 0
0 : 0

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

【问题讨论】:

  • 我会尝试查找重复项,但您返回的是指向局部变量的指针。
  • 倒数第二行,试试struct Map *ptr = &amp;array;struct Map *ptr = &amp;array[0];
  • @psinaught 第一个是类型错误,第二个没有解决问题(返回一个指向局部变量的指针)。
  • @melpomene 您找到重复项了吗?我仍然不确定如何解决它。我不确定哪个结构是超出范围的局部变量。是数组[n]吗?还是ptr?它们都是在收集值函数中本地创建的。
  • 顺便说一句,您返回的是一个不存在的元素的地址。 array 具有 n 元素,因此有效索引范围从 0n-1&amp;array[n] 是数组末尾后一个元素的地址。 arrayptr 都是局部变量,在函数返回时死掉,但return ptr 表示返回ptrcopy,所以这部分没问题。然而,这个指针指向array 的一个元素,它不再存在,这就是问题所在。我发现了重复;如果它们没有为您显示,请滚动到顶部(并可能重新加载页面)。

标签: c pointers struct


【解决方案1】:

结构是在本地声明的,因此在其范围(即声明它的函数)结束后“死亡”,这会导致“垃圾”值。

你应该

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

【讨论】:

  • 你介意更明确一点吗?对于您的第二个选项,这是我想我想做的,因为我想保持我的主要方法精益(我实际上将该指针发送到另一个函数,但我想看看它是否会在第一个地方),我应该在 collect_values() 中做这样的事情: struct Map *ptr; ptr = malloc(sizeof(struct Map));返回指针;然后在main方法中free?但是如果我从不说要指向 array[n] 结构,它怎么知道呢?
  • @Rahme 你不应该有array[n](顺便说一句,它是一个数组,而不是一个结构)。 array 是一个本地数组是整个问题的所在。相反,您应该使用struct Map *array = calloc(n, sizeof *array); ... return array;,然后在使用完后在main free(p);
  • 假设我将 *p 从 main 传递到另一个函数以对结构进行排序。我是否也释放该函数中的内存?还是只是主要的?我什么时候需要释放内存?
  • free 应该只发生一次,当你用完内存时。一个好的做法是从分配内存的函数中执行此操作(但如果您从其调用者/被调用者执行此操作,它也会起作用,尽管更难理解)
猜你喜欢
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多