c - 程序打印我想要的结果,除了在一个地方我得到的是内存地址而不是地址的值。

标签 c arrays sorting pointers

练习基本上是说“创建一个函数,它将一个数组及其大小作为参数,并返回一个新数组,其中包含作为参数给出的数组的三个最大值。”所以我想我将获取数组并在函数中对其进行排序,然后将 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/

相关文章:

c++ - 增加 C/C++ 程序使用的(非堆栈)内存

javascript - 在 javascript 的排序列表中搜索项目的最佳方法是什么?

c - 如何将两个数组一起排序,其中第一个数组使用冒泡排序进行排序?

c - 将转换说明符作为参数传递给 printf()

C 写串行,重定向到文件,终止

C - GCC 在返回本地堆栈地址时生成错误指令

javascript - 使用 setinterval JavaScript 更新后数组计数不匹配

ios - '[[字符串] ]' to expected argument type ' [字符串]'

c# - 在 OpenCV 中将图像转换为 BYTE 指针的 MatchTemplate 图像

algorithm - 计算排序统计数据的交换 - 只有两个分配而不是三个分配的交换