使用 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;

    }
}