首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我在main func中打印返回数组的地址时,相同的内存位置打印了两次,即使我调用了一次函数来打印地址

当我在main func中打印返回数组的地址时,相同的内存位置打印了两次,即使我调用了一次函数来打印地址
EN

Stack Overflow用户
提问于 2021-06-06 11:42:33
回答 2查看 75关注 0票数 0
代码语言:javascript
复制
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;
}

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

EN

回答 2

Stack Overflow用户

发布于 2021-06-06 12:12:48

您在函数外部和函数内部打印的地址将是相同的。它是arr中第一个元素&arr[0]的地址,它将在您的程序中打印三次。

  • 您调用bubble_sort两次,因此将在bubble_sort内部打印两次。
  • 您在main.
  • So: 2+1= 3

中打印一次地址

一些问题:

  • void main()不是有效的main签名。它应该返回int
  • for(j=0;j<10;j++),而a[j+1]会使你的程序具有未定义的行为。当j9
  • printf("%d", a);时,您将越界访问a,并且printf("\n%d\n",bubble_sort(arr));还会使您的程序具有未定义的行为,因为您为%d转换说明符提供了一个地址。在不必要的情况下使用%p打印pointers.
  • You循环的值。值“冒泡”后,您不需要再次检查它,并且again.
  • Calling bubble_sort两次为unnecessary.

建议的更改:

代码语言:javascript
复制
#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;
}

可能的输出:

代码语言:javascript
复制
in bubble_sort: 0x7ffc91ff68d0
in main:        0x7ffc91ff68d0

printing sorted elements ...
7
9
10
12
23
23
34
44
78
101
票数 1
EN

Stack Overflow用户

发布于 2021-06-06 13:37:24

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

从下面的代码

代码语言:javascript
复制
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()的函数调用-注意,在bubble_sort()函数中也打印了数组的地址。所有这三个地址都指向arr[]的起始地址。

因此3次地址打印来自于

从线路printf("\n%d\n",bubble_sort(arr));

  1. 2次(一次来自printf,另一次来自bubble_sort(arr)函数调用)来自int *p = bubble_sort(arr);

  • 1次
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67855597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档