c-当我在主函数中打印返回数组的地址时,相同的内存位置打印了两次,尽管我调用了一次函数来打印地址


int *bubble_sort(int[]);
void main()
{
int arr[10]={ 10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
printf("n%dn",bubble_sort(arr));
int *p = bubble_sort(arr);
printf("nprinting sorted elements ...n");
for(int i=0;i<10;i++)
printf("%dn",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;
}

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

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

  • 您调用bubble_sort两次,因此bubble_sort内部的打印将被打印两次
  • 您在main中打印一次地址
  • 因此:2+1=3

一些问题:

  • void main()不是有效的main签名。应返回int
  • for(j=0;j<10;j++)a[j+1]使程序具有未定义的行为。当j9时,您对a的访问越界
  • printf("%d", a);printf("n%dn",bubble_sort(arr));还使程序具有未定义的行为,因为您为%d转换说明符提供了地址。使用%p打印指针的值
  • 你的循环比必要的要多。在一个值具有"0"之后;起泡";,你不需要反复检查
  • 不需要调用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: %pn", (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:        %pn", (void*)p);     /* %p to print pointers */
printf("nprinting sorted elements ...n");
for(int i = 0; i < 10; i++) printf("%dn", p[i]);
return 0;
}

可能输出:

in bubble_sort: 0x7ffc91ff68d0
in main:        0x7ffc91ff68d0
printing sorted elements ...
7
9
10
12
23
23
34
44
78
101

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

来自下方的代码

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

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

因此3次地址打印来自

  1. 2次来自线路printf("n%dn",bubble_sort(arr));(一次来自printf,另一次来自于bubble_sort(arr)功能调用(
  2. int *p = bubble_sort(arr);起1次