如何在C中返回指向结构数组的指针?
我创建了一个函数,该函数用int填充结构的值,并应该返回指向同一结构的指针。但是,当我打印指针引用的内容时,它会打印垃圾值 这是我的密码:如何在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("
#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
,但它无法编译。我做错了什么?结构是在本地声明的,因此在其作用域(即声明它的函数)结束后“死亡”,从而导致“垃圾”值
你也应该
我将尝试查找重复项,但您返回的是指向局部变量的指针代码>或
结构映射*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