有没有办法在返回数组中不使用指针?(警告:传递 'arrangef' 的参数 1 使指针从整数而不进行强制转换。)

长国权

我试图编写 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*函数 expect int *,您传递的是int)并且它超出了数组的边界,所以价值未知。

除了当它是的操作数sizeof或一元&运算符,或者是用于初始化在声明的字符阵列,字符串常量表达式类型的“的N元件阵列T”被转换(“衰变”),以类型的表达式“指向”的指针T,表达式的值是数组第一个元素的地址。

所以当你打电话

arrangef( a );

表达式a从“ n-element array of int隐式转换为“pointer to 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. 实际上,您可以传递任何数组类型的表达式,它会被转换为指针类型,但现在我们只保留名称。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档