c - 有没有办法在返回数组时不使用指针? (警告: passing argument 1 of 'arrangef' makes pointer from integer without a cast.)

标签 c

我尝试编写 2 个子程序来按升序和降序排列数组,但它给了我指针和强制类型转换的问题。有办法解决这个问题吗?

我尝试将所有代码放入一个大程序中,它运行得完美无缺。 我尝试在子程序中强制转换指针,但没有成功。

#include <stdio.h>
#include <math.h>
void arrangef (int a[]){
    int i, j, temp;
    for (i=0;;i++){
        for (j=1;;j++){
            if (a[i]>a[j]) {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
}

void arrangeb (int a[]){
    int i, j, temp;
    for (i=0;;i++){
        for (j=1;;j++){
            if (a[i]>a[j]) {}
                else {
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
            }
        }
    }
}

int main () {
    int i, n;
    printf("What is the size of your array?\t"); scanf("%d",&n);
    int a[n];
    for (i=0;i<n;i++) {
        printf("\nInsert element #%d of array\t",i+1); scanf("%d",&a[i]);
    }
    printf("\n\n");
    for (i=0;i<n;i++) {
        printf("%d\t",a[i]);}

    printf("\n");

    arrangef(a[n]);
    for (i=0;i<n;i++) {
        printf("%d\t",a[i]);}
    printf("\n");

    arrangeb(a[n]);
    for (i=0;i<n;i++) {
        printf("%d\t",a[i]);
    }
}

我希望输出是 3 个数字列表,原始列表、升序排列和降序排列,但程序崩溃了。

最佳答案

要将数组传递给函数,只需指定数组名称1:

arrangef( a );
...
arrangeb( a );

a[n] 指定数组的单个元素,并且它是数组中最后一个元素之后的一个元素,因此您传递了错误的表达式类型(arrange* 函数需要 int *,您正在传递 int)并且它超出了数组的范围,因此该值是不知道。

除非它是 sizeof 或一元 & 运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则 T 的 N 元素数组”类型的表达式 转换(“衰减”)为“指向 T 的指针”类型的表达式,并且值表达式的地址是数组第一个元素的地址。

所以当你打电话时

arrangef( a );

表达式a从“n元素数组int”隐式转换为“指向int的指针” >”,而表达式的值就是a[0]的地址,所以arrangef实际接收到的是一个指针值。

在函数参数声明中,T a[N]T a[] 被“调整”为 T *a - 所有其中三个将 a 声明为指向 T 的指针。

由于函数接收的所有内容都是数组第一个元素的地址,因此您还必须将元素数量作为单独的参数传递,或者一个元素必须包含标记数据结尾的哨兵值(例如字符串中的 0 终止符)。在您的情况下,您需要单独传递尺寸:

void arrangef( int *a, size_t n ) // or int a[]
{
  for ( int i = 0; i < n; i++ ) // don't loop past the last element in the array
  {
    for ( int j = i; j < n; j++ ) 
    {
      int tmp = a[i];
      a[i] = a[j];
      a[j] = tmp;
    }
  }
}

arrangeb 看起来是一样的,只是顺序不同。

for( i = 0; ; i++ ) 将“永远”循环 - 它将循环越过数组末尾并最终进入不属于您的内存,从而导致运行时错误。 i 最终也会溢出,并且有符号整数溢出的行为没有明确定义。基本上,这个循环将会爆炸。


  1. 实际上,您可以传递任何数组类型的表达式,它会转换为指针类型,但现在我们只使用名称。

关于c - 有没有办法在返回数组时不使用指针? (警告: passing argument 1 of 'arrangef' makes pointer from integer without a cast.),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56448605/

相关文章:

c - 使用 doxygen 记录配置宏

c - 寻找最新的 C Rar 库

c - 在 gdb 中使用 STDOUT

c - C 中的隐式声明

C语言计算2的最高次幂整除一个数

c++ - _mm_shuffle_ps 即使包含 header 也未声明

c - 为什么用gcc和std=c99编译时找不到getaddrinfo

c - 如何用 C 语言编写带有可变参数的函数

c - 如何使用用户密码进行 aes 加密?

c - 在使用mmap的Linux上分配地址零失败