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

    } 
+0

你的编译器应该骂你。使用正确的原型,您的代码不符合标准并调用未定义的行为。 (这比指针更重要。您是否跳过C书中关于函数和函数声明的章节?) – Olaf

+0

您可以在所需的任何函数中使用'printf'。 – user3528438

+0

user3528438这是学校练习,教授告诉我不要使用printf。 @Olaf这个原型是否正确:void form(int,int)。函数声明看起来很好。这就是我受教的方式。 – Misery

你的代码有几个问题。

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是一样的东西)

+1

void form(int N,int ptr [100]); – user3528438

+0

@ user3528438对不起,忘记了,谢谢。 – schil227

+0

@ user3528438:这是错误的。它应该是'int ptr [N]'(最清晰的版本)或'int ptr []'或'int * ptr',而不是'int ptr [100]'。 – Olaf

您的代码小的修改:

1)纠正和参数的函数调用处理的简化。只需交出“a”,它是一个数组,因此它是一个地址,您可以在其正式参数列表中使用int *ptrint 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; 

    } 
} 
+0

其中教OP什么也没有。给他喂鱼。 – Olaf

+0

@Olaf当然,你是对的。我纠正了我的答案。 – quantummind

+0

“使用参数列表更正原型声明”。 - 你的意思是让它成为一个原型**。现在,它不是一个原型,而只是一个旧式的声明。 – Olaf