gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:37:14 27 4
gpt4 key购买 nike

我尝试编写 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] 指定数组的单个元素,它是数组中 last 元素之后的一个元素,因此您传递的是错误的表达式类型(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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com