2015-10-08 25 views
1

我是第二年的計算機工程師,仍然在學習C語言的過程。我想不想動手如何通過使用函數而不是在主內部分配數組來分配數組。如何使用指針在另一個函數內部分配數組

這裏是我在main中分配數組時工作的代碼。

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include <time.h> 

#define ESC_KEY 27 
#define NUM_1_KEY 49 
#define NUM_2_KEY 50 

void find_two_largest(int a[], int n, int *largest, int *second_largest); 
void arrayInit(int *,int *, int, int); 
void randGenArray(int [], int); 
void inputArray(int[], int); 
void result(int, int); 
void loading(void); 
int menu(void); 

int main(void) 
{ 
    system("color f5"); 
    int n,i,largest,largest_2, *a; 

    arrayInit(a,&n, 2, 10); 

    if(menu()) 
     randGenArray(a,n); 
    else 
     inputArray(a,n); 

    find_two_largest(a,n,&largest,&largest_2); 
    result(largest,largest_2); 
    return 0; 
} 


void find_two_largest(int a[], int n, int *largest, int *second_largest) 
{ 
    int i=0,j=0; 
    system("cls"); 
    loading(); 
    *largest = 0; 
    *second_largest = *largest; 
    for (i=1;i<n;i++){ 
     if(*largest<a[i]) 
      *largest=a[i]; 
    } 
    for(j=1;j<n;j++){ 
     if(*largest==a[j]) 
      continue; 
     else{ 
      if(*second_largest<a[j]) 
       *second_largest=a[j]; 
     } 
    } 
    return; 
} 

void randGenArray(int a[], int n) 
{ 
    srand(time(NULL)); 
    int i; 
    for(i=0; i<n; i++){ 
     a[i]=rand()%100; 
     Sleep(10); 
     printf("\n>> Integer %d: %d", i+1, a[i]); 
    } 
    printf("\n\n\nPress any key to continue..."); 
    getch(); 
    return; 
} 

void inputArray(int a[], int n) 
{ 
    int i; 
    for(i=0; i<n; i++){ 
     printf("\n Please enter integer %d: ", i+1); 
     scanf("%d",&a[i]); 
    } 
    return; 
} 

int menu(void) 
{ 
    char _char; 

    printf("\n Please choose one of the following options:\n 1.Fill array manually\n 2.Fill array by random numbers\n\n "); 

    while(1) 
    { 
     _char = getch(); 
     switch(_char) 
     { 
      case ESC_KEY: 
       printf("\n\n Thank you for using our software!\n\n"); 
       exit(0); 

      case NUM_1_KEY: 
       system("cls"); 
       return 0; 

      case NUM_2_KEY: 
       system("cls"); 
       return 1; 

      default: 
       break; 
     } 
    } 
} 

void arrayInit(int *a,int *n, int min, int max) 
{ 
    printf("\n Please enter a length of the array: "); 

    do{ 
    scanf("%d", n); 
    if (*n<min||*n>max) 
     printf("\nThe ranged is limited. Please enter the value between %d and %d.\n", min, max); 
    } while(*n<min||*n>max); 

    a = (int*)calloc(*n,sizeof(int)); 

    return; 
} 

void loading(void) 
{ 
    printf("\n Loading"); 
    printf("."); 
    Sleep(300); 
    printf("."); 
    Sleep(300); 
    printf("."); 
    Sleep(300); 
    system("cls"); 
    return; 
} 

void result(int l, int l2) 
{ 
    system("cls"); 
    printf("\n Largest = %d  Second Largest = %d",l,l2); 
    Sleep(500); 
    printf("\n\n\n Thank you using our software! ;D\n\n"); 
    return; 
} 

但是,如果您將此行從arrayInit剪切並粘貼到main並將* n更改爲n,則它將起作用!

a =(int *)calloc(* n,sizeof(int));

我很抱歉問這麼愚蠢和明顯的事情,但我沒有自己弄明白。感謝您的任何建議。

+1

'a'是一個地方vari當你返回時,它會超出範圍,直接在你分配了內存之後。你需要傳遞一個指向int的指針,或者更簡單的話,可以返回新分配的內存。 –

+0

我發現我需要的值後忘記釋放內存。< –

+1

順便說一下,我喜歡'loading'函數。 –

回答

1

下面是一個簡單的程序,它會告訴你該怎麼做 -

#include <stdio.h> 
#include <stdlib.h> 

void create(int **p,int n); // function taking arguments as int ** and n is number of elements 

int main(void) { 
    int *a;  
    int n=5,i;      // declare and initialize n 
    create(&a,n);    // pass address of a to function 
    for(i=0;i<n;i++){ 
     a[i]=i;     // store value of i in a[i] 
     printf("%d\n",i);   // print a[i] 
    } 
    free(a);      // free the allocated memory 
    return 0; 
} 

void create(int **p, int n){ 
     *p=calloc(n,sizeof(int));   // allocate memory to *p (type- is int *) 
    } 

Working Code

+0

完美!這就是我想到的。但是爲什麼你傳遞了地址指針的地址。如果技術上'a'是數組的地址? –

+0

@KasparSiricenko我傳遞了'int *'的地址,以便它在函數終止後不會超出範圍。正如M.Ohem在他的評論中所描述的'a'是局部變量,所以返回後它將在函數終止時超出範圍 – ameyCU

+0

@KasparSiricenko'a'在你的代碼中只是一個指針,它不會指向任何代碼顯示。 – ameyCU

0

你必須改變你的函數返回類型

void * arrayInit(int *n, int min, int max) 
{ 
    printf("\n Please enter a length of the array: "); 

    do{ 
    scanf("%d", n); 
    if (*n<min||*n>max) 
     printf("\nThe ranged is limited. Please enter the value between %d and %d.\n", min, max); 
    } while(*n<min||*n>max); 

    return calloc(*n,sizeof(int)); 
} 

而且從main在調用它這樣:a = arrayInit(&n, 2, 10);

+0

謝謝。但我不想回報任何東西。 –

+0

@KasparSiricenko return是將堆分配內存分配給主局部變量a的方式:您必須將其返回。 – LPs

相關問題