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