使用 void 函数指向数组
Pointing to arrays using void function
对不起这个标题。我真的不知道如何定义这个问题。
我需要声明 N 个数字的整数数组并在 void 函数中用随机数填充它。然后需要在 main 中打印该数组。问题是我不允许在 void 函数中使用 printf,所以在 main 中打印的唯一方法是使用我猜的指针。我的知识有限,因为我是初学者。提前致谢,抱歉英语不好。
到目前为止,这是我的代码。当我编译时它标记分段错误。
#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;
}
所以有几件事:
void form();
正如 Olaf 所暗示的,此声明不正确 - 您缺少适用的参数。相反,它应该是
void form(int N, int ptr[100]);
您的程序崩溃的主要原因是以下行:
*ptr[i] = rand() % 46;
您正在取消对 i 处指针的引用,这实际上给了您一个数字 - 您想要的是将 i 处指针的值分配给新的随机值:
ptr[i] = rand() % 46;
作为相关阅读,请参阅此 question 关于将数组作为函数参数传递(基本上,int ptr[]
与 int * ptr
相同)
您的代码中存在几个问题。
1) 您的数组声明 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;
}
}
对您的代码进行少量修改:
1) 更正和简化函数调用时的参数处理。只要交出"a",它是一个数组,所以它是一个地址,你可以在形参列表中使用int *ptr
,或者int ptr[]
,或者int ptr[100]
。所以你可以在你的函数中简单地使用 ptr[i]。
2) 从提供参数列表的旧式声明中创建函数原型。
3) int i;
for 循环之前的声明 - 不是强制性的,取决于您的编译器标准
#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;
}
}
对不起这个标题。我真的不知道如何定义这个问题。
我需要声明 N 个数字的整数数组并在 void 函数中用随机数填充它。然后需要在 main 中打印该数组。问题是我不允许在 void 函数中使用 printf,所以在 main 中打印的唯一方法是使用我猜的指针。我的知识有限,因为我是初学者。提前致谢,抱歉英语不好。
到目前为止,这是我的代码。当我编译时它标记分段错误。
#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;
}
所以有几件事:
void form();
正如 Olaf 所暗示的,此声明不正确 - 您缺少适用的参数。相反,它应该是
void form(int N, int ptr[100]);
您的程序崩溃的主要原因是以下行:
*ptr[i] = rand() % 46;
您正在取消对 i 处指针的引用,这实际上给了您一个数字 - 您想要的是将 i 处指针的值分配给新的随机值:
ptr[i] = rand() % 46;
作为相关阅读,请参阅此 question 关于将数组作为函数参数传递(基本上,int ptr[]
与 int * ptr
相同)
您的代码中存在几个问题。
1) 您的数组声明 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;
}
}
对您的代码进行少量修改:
1) 更正和简化函数调用时的参数处理。只要交出"a",它是一个数组,所以它是一个地址,你可以在形参列表中使用int *ptr
,或者int ptr[]
,或者int ptr[100]
。所以你可以在你的函数中简单地使用 ptr[i]。
2) 从提供参数列表的旧式声明中创建函数原型。
3) int i;
for 循环之前的声明 - 不是强制性的,取决于您的编译器标准
#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;
}
}