C - 使用指向函数的指针没有结果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C - 使用指向函数的指针没有结果相关的知识,希望对你有一定的参考价值。
我正在创建一个程序,它使用指向函数的指针,允许用户从2个选项中选择对整数数组执行:反向或随机。但是,程序在执行时不会产生任何输出。我哪里做错了?
void reverseArray(int arraySize, int a[]);
void randomiseArray(int arraySize, int a[]);
void printArray(int arraySize, int a[], void (*arrayFunction)(int arraySize, int a[]));
int main ()
{
srand(time(NULL));
int selection;
int myArray[] = {2,4,6,8,10,12,14,16,18,20};
printf("Enter 0 for reverse, 1 for randomise.
");
scanf("%d",&selection);
if (selection == 0)
printArray(sizeof(myArray)/sizeof(myArray[0]),myArray,reverseArray);
else if (selection == 1)
printArray(sizeof(myArray)/sizeof(myArray[0]),myArray,randomiseArray);
else
printf("Please make a valid selection
");
return 0;
}
void reverseArray(int arraySize, int a[])
{
int i,j=arraySize,swap=0;
for (i=0;i<arraySize/2;i++)
{
swap = a[i];
a[i] = a[j];
a[j] = swap;
--j;
}
}
void randomiseArray(int arraySize, int a[])
{
int i,j,swap;
for (i=0;i<arraySize;i++)
{
j = rand()%(i+1);
if (j!=i)
{
swap = a[i];
a[i] = a[j];
a[i] = swap;
}
}
}
void printArray(int arraySize, int a[], void (*arrayFunction)(int arraySize, int a[]))
{
arrayFunction(arraySize, a);
for (int i = 0; i < arraySize; i++)
{
printf("%d ", a[i]);
}
printf("
");
}
用户通过键入0表示反向或1表示随机选择他们想要执行的功能。根据该决定,调用printArray
函数并进行相应的选择。
reverseArray
只是一个通用交换函数,randomiseArray
使用Fisher-Yates混洗算法。
我假设我的错误来源于printArray
fucntion,但我无法纠正它。
答案
两个错误
在reverseArray中,j
应该从arraysize - 1
开始,否则你将在数组的末尾写一个元素
void reverseArray(int arraySize, int a[])
{
int i, j = arraySize - 1, swap = 0;
for (i = 0; i<arraySize / 2; i++)
{
swap = a[i];
a[i] = a[j];
a[j] = swap;
--j;
}
}
在randomizearray()
,你分配给a[i]
两次,而不是使用a[j]
进行最后的任务。
void randomiseArray(int arraySize, int a[])
{
int i, j, swap;
for (i = 0; i<arraySize; i++)
{
j = rand() % (i + 1);
printf("%d %d
", i, j);
if (j != i)
{
swap = a[i];
a[i] = a[j];
a[j] = swap;
}
}
}
第一个错误在反转时导致未定义的行为,第二个错误导致数组保持不变。除此之外,函数指针设置正常并且正常工作。
另一答案
在reverseArray()你的指数j
超出范围,它应该是j=arraySize-1
除此之外它对我有用。
另一答案
您正在数组的边界外访问,导致UB,在这种情况下“无输出”:
在reverseArray
,你必须初始化j=arraySize-1
。如果没有-1
,你就会超出界限。
以上是关于C - 使用指向函数的指针没有结果的主要内容,如果未能解决你的问题,请参考以下文章
C 语言二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )