练习基本上是说“创建一个函数,它将一个数组及其大小作为参数,并返回一个新数组,其中包含作为参数给出的数组的三个最大值。”所以我想我将获取数组并在函数中对其进行排序,然后将 3 个最高值赋给一个新数组并返回它。那是我的代码。
int *function(int *A, int k){
int B[3],i,j,temp;
//Sorting
for(i=k-1;i>0;i--){
for(j=1;j<=i;j++){
if(A[j-1] > A[j])
{
temp = A[j-1];
A[j-1] = A[j];
A[j] = temp;
}
}
}
i = 0;
while(i < 3){
B[i]= A[k-1];
i++;
k--;
}
return B;
}
int main (int argc, const char * argv[]) {
int A[5] = {1,8,7,4,6};
int size = 5;
int *func,i;
func = function(A,size);
for(i=0;i<3;i++)
printf("%d ",func[i]);
return 0;
}
结果我应该得到 8 7 6 但我得到 8 -1073743756 6。我找不到错误。当我想返回 B 时,我也会收到警告。它说“局部变量的函数返回地址”。也许这与这个问题有关。有什么想法吗?
最佳答案
函数返回后,自动存储对象(如int B[3]
)被销毁,因此引用它们是非法的。在实践中,由于写入堆栈的各种内容,您会得到意想不到的值:
您可以:
- 给B静态存储
- 使用
malloc
(后来free
) - 完全使用不同的方法,例如让调用者负责传递
B
关于c - 程序打印我想要的结果,除了在一个地方我得到的是内存地址而不是地址的值。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9859512/