我试图编写 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
最终也会溢出,并且有符号整数溢出的行为没有明确定义。基本上,这个循环会爆炸。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句