使用void函数指向数组
对不起,标题。我真的不知道如何定义这个问题。使用void函数指向数组
我需要声明N个数字的整数数组,并用void函数中的随机数填充它。然后该数组需要在main中打印。问题是我不允许在void函数中使用printf,所以只有在main中打印的方法是使用我猜测的指针。因为我是初学者,所以我的知识是有限的。 Thx提前,并对坏英语感到抱歉。
这是我的代码到目前为止。当我编译它标记分割错误。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void form();
int main()
{
int N, a[100];
printf("Input index: \n");
scanf("%d", &N);
form(N, &a);
printf("Array: \n");
for (int i = 0; i < N; i++) {
printf("a[%d] = %d", i, a[i]);
}
}
void form(int N, int *ptr[100])
{
srand(time(NULL));
for (int i = 0; i < N; i++) {
*ptr[i] = rand() % 46;
}
你的代码有几个问题。
1)您的数组decoraration form()
已过时。使用适当的原型。
2)为了声明VLA,在读取N之后声明它,而不是使用固定大小的数组。
3)将数组传递给函数时,将数组转换为指向其第一个元素的指针。请参阅:What is array decaying?
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void form(int, int*); /* see (1) */
int main(void) /* Standard complaint prototype for main.
If you need to pass arguments you can use argc, and argv */
{
int N;
printf("Input size: \n");
scanf("%d", &N);
int a[N]; /* see (2) */
form(N, a); /* see (3) */
printf("Array: \n");
for (int i = 0; i < N; i++) {
printf("a[%d] = %d", i, a[i]);
}
}
void form(int N, int *ptr) { /* Modified to match the prototype
srand(time(NULL));
for (int i = 0; i < N; i++) {
ptr[i] = rand() % 46;
}
}
那么几件事情:
void form();
奥拉夫被影射,这个声明是不正确 - 你缺少适用的参数。相反,它应该是
void form(int N, int ptr[100]);
程序发生崩溃的原因主要是因为以下行:
*ptr[i] = rand() % 46;
你在我提领的指针,这是actaully给你一个数字 - 什么你想要的是指针的值在我分配新的随机值:
ptr[i] = rand() % 46;
由于相关阅读,请参阅本question约在传递一个数组作为FUNC (基本上,int ptr[]
与int * ptr
是一样的东西)
void form(int N,int ptr [100]); – user3528438
@ user3528438对不起,忘记了,谢谢。 – schil227
@ user3528438:这是错误的。它应该是'int ptr [N]'(最清晰的版本)或'int ptr []'或'int * ptr',而不是'int ptr [100]'。 – Olaf
您的代码小的修改:
1)纠正和参数的函数调用处理的简化。只需交出“a”,它是一个数组,因此它是一个地址,您可以在其正式参数列表中使用int *ptr
或int ptr[]
或int ptr[100]
。所以你可以在你的函数中简单地使用ptr [i]。
2)从提供参数列表的旧式声明中为函数做一个原型。
3)前的for循环int i;
声明 - 不是强制性的,取决于你的编译器的标准
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void form(int N, int *ptr);
int main()
{
int N, a[100];
printf("Input index: \n");
scanf("%d", &N);
form(N, a);
printf("Array: \n");
int i;
for (i = 0; i < N; i++) {
printf("a[%d] = %d", i, a[i]);
}
}
void form(int N, int *ptr)
{
srand(time(NULL));
int i;
for (i = 0; i < N; i++) {
ptr[i] = rand() % 46;
}
}
其中教OP什么也没有。给他喂鱼。 – Olaf
@Olaf当然,你是对的。我纠正了我的答案。 – quantummind
“使用参数列表更正原型声明”。 - 你的意思是让它成为一个原型**。现在,它不是一个原型,而只是一个旧式的声明。 – Olaf
你的编译器应该骂你。使用正确的原型,您的代码不符合标准并调用未定义的行为。 (这比指针更重要。您是否跳过C书中关于函数和函数声明的章节?) – Olaf
您可以在所需的任何函数中使用'printf'。 – user3528438
user3528438这是学校练习,教授告诉我不要使用printf。 @Olaf这个原型是否正确:void form(int,int)。函数声明看起来很好。这就是我受教的方式。 – Misery