【问题标题】:When I printed the address of returned array in main func, Same memory location is printing twice even though I called function once to print address当我在主函数中打印返回数组的地址时,即使我调用函数一次来打印地址,相同的内存位置也会打印两次
【发布时间】:2021-06-06 03:42:33
【问题描述】:
int *bubble_sort(int[]);
 void main()
{
    int arr[10]={ 10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
    printf("\n%d\n",bubble_sort(arr));
    int *p = bubble_sort(arr);
    printf("\nprinting sorted elements ...\n");
    for(int i=0;i<10;i++)
       printf("%d\n",p[i]);
    return 0; 
}
 int *bubble_sort(int a[])
{
    int i,j,temp;
    for(i=0;i<10;i++)
       {
        for(j=0;j<10;j++)
         {
            if(a[j]>a[j+1])
               {
                 temp = a[j];
                 a[j]=a[j+1];              
              a[j+1] = temp;
               }
          }
       }
    printf("%d",a);
    return a;
}

在主函数中,我调用了冒泡排序,它返回数组的基本位置并打印出该位置。即使它指向相同的内存位置,仍然会打印两次地址。请分享您对这种行为的看法。 待分析的行"printf("\n%d\n",bubble_sort(arr));"

【问题讨论】:

  • 您将地址打印在bubble_sort 的正文中。调用bubble_sort 作为printf 的参数会打印一次,printf 会打印第二次。

标签: arrays c function


【解决方案1】:

你在函数外和函数内打印的地址是一样的。它是arr&amp;arr[0] 中第一个元素的地址 - 它将在您的程序中打印 3 次。

  • 你调用bubble_sort两次,所以bubble_sort里面的打印会被打印两次。
  • 您在main 中打印一次地址。
  • 所以:2 + 1 = 3

一些问题:

  • void main() 不是有效的 main 签名。它应该返回int
  • for(j=0;j&lt;10;j++)a[j+1] 使您的程序具有未定义的行为。当j9 时,您访问a 越界
  • printf("%d", a);printf("\n%d\n",bubble_sort(arr)); 还使您的程序具有未定义的行为,因为您向 %d 转换说明符提供了地址。使用%p 打印指针的值。
  • 您的循环超出了必要。在某个值“冒泡”后,您无需一次又一次地检查它。
  • 无需调用bubble_sort 两次。

建议的更改:

#include <stdio.h>

int* bubble_sort(int a[], int length) {   /* take the length as an argument */
    int i, j, temp;
    for(i = 0; i < length; i++) {         /* 0 up to 9 */
        for(j = length - 1; j > i; j--) { /* 9 down to i + 1 */
            if(a[j] < a[j - 1]) {
                temp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = temp;
            }
        }
    }
    printf("in bubble_sort: %p\n", (void*)a);     /* %p to print pointers */
    return a;
}

int main(void) {
    int arr[10] = {10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
    int* p = bubble_sort(arr, sizeof(arr) / sizeof(arr[0])); /* call once only */
    printf("in main:        %p\n", (void*)p);     /* %p to print pointers */
    printf("\nprinting sorted elements ...\n");
    for(int i = 0; i < 10; i++) printf("%d\n", p[i]);
    return 0;
}

可能的输出:

in bubble_sort: 0x7ffc91ff68d0
in main:        0x7ffc91ff68d0

printing sorted elements ...
7
9
10
12
23
23
34
44
78
101

【讨论】:

  • @TedLyngmo 您编辑的程序仍然在外循环中运行了一次,因此我们可以将其长度设置为 1 以使其最佳。但仍然没有得到它背后的确切原因 0061FEA0, 0061FEA0 打印排序元素... 7 9 10 12 23 23 34 44 78 101 得到了答案,但不清楚功能。
  • @pranaynallapaneni - 在 printf 语句中,您正在调用内部打印数组地址的 bubble_sort() - 进行交叉检查,在每个 printf 语句中添加几个字符,您就会知道为什么,会更好
  • @pranaynallapaneni 很好地了解了循环。是的,地址相同。这是我刚刚添加到答案中的arr (&amp;arr[0]) 中第一个元素的地址。
  • @Sudhee 谢谢你的准确点。如果我在将函数分配给指针后打印指针。地址打印两次。 int *p = bubble_sort(arr); printf("\n%p\n",p);如果我在指针声明上方使用bubble_sort(arr),它会打印三次。你能解释一下这种行为吗?
  • @ikegami:() 的特殊含义仅适用于非定义的函数声明。在函数定义中 int main() {... 和 int main(void) {... 是相同的。
【解决方案2】:

回答为什么要打印2次(实际上是3次)地址

从下面的代码

int arr[10]={ 10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
printf("\n%d\n",bubble_sort(arr));
int *p = bubble_sort(arr);

bubble_sort() 有 2 次函数调用 - 请注意,您也在 bubble_sort() 函数中打印数组的地址。这三个地址都指向 arr[] 的开头。

因此3次地址打印来自

  1. 2 次来自 lineprintf("\n%d\n",bubble_sort(arr));(一次来自printf,另一次来自bubble_sort(arr) 函数调用)
  2. 1 次来自int *p = bubble_sort(arr);

【讨论】:

  • 感谢您的说明,我明白了。我假设相同,但返回 arr 让我感到困惑。 printf 是独立的,所以它可以打印它的地址。
  • 如果我们打印指针的地址,我们会得到两个地址,即指针地址和 arr 地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
相关资源
最近更新 更多