2016-11-17 333 views
-1

對不起,標題。我真的不知道如何定義這個問題。使用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

回答

0

你的代碼有幾個問題。

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; 

    } 
} 
0

那麼幾件事情:

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

您的代碼小的修改:

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