运行代码时:
#include<stdio.h>
void insert(int len,int ele,int pos, int ar[]){
int x= pos,i;
for (i=0;i<len;i++){
ar[pos+1]=ar[pos];
pos++;
}
ar[x]=ele;
for (i=0;i<len+1;i++){
printf("%d",ar[i]);
}
}
int main(){
int len,pos,ele,i;
int ar[len];
printf("Enter length of array");
scanf("%d",&len);
for( i=0;i<len;i++){
printf("Enter element ");
scanf("%d",&ar[i]);
}
printf("Enter element to insert ");
scanf("%d",&ele);
printf("Enter position ");
scanf("%d",&pos);
insert(len,ele,pos,ar[len]);
}
我收到这个错误:
test.c: In function 'main':
test.c:26:5: warning: passing argument 3 of 'insert' makes pointer from integer without a cast [enabled by default]
insert(ele,pos,ar[5]);
^
test.c:2:6: note: expected 'int *' but argument is of type 'int'
void insert(int ele,int pos, int ar[5]){
我是一个初学编程的人,正在为大学课程学习C。我试图理解这个错误,但我做不到。任何帮助将不胜感激。
2条答案
按热度按时间vlf7wbxs1#
是一种 * 声明 *
int
数组的方法。它为数组指定的名称是ar
,所以当你想 * 引用 * 该数组本身时,只需使用ar
。如果在一个表达式中,你说
ar[len]
,它指定了数组ar
中索引len
处的int
--在这种情况下,恰好超出了数组的范围,所以代码是双重错误的。因此,在这里:
你是说
,或者,等价地,
uplii1fm2#
insert
函数期望ar
参数是指向int
的指针。通过传递一个int
数组的元素,你只传递了一个int
。这是一个警告而不是错误,因为指针是数值类型,所以你可以这样做,但你不应该这样做。您刚刚传递了一个无效指针。然后,你的函数会尝试用下面的语句引用那个 (不是真正的) 指针:
记住
ar[pos]
等价于*(ar + pos)
。这会引发可怕的未定义行为。
你应该只是把
ar
传递给insert
。数组衰减为指向其第一个元素的指针。还要注意的是,C(和许多其他语言)的数组索引从
0
开始,所以对于长度为len
的数组arr
,数组中的最后一个有效元素是arr[len-1]
。