如何使用指针在另一个函数中分配数组
Posted
技术标签:
【中文标题】如何使用指针在另一个函数中分配数组【英文标题】:How to use pointers to allocate an array inside another function 【发布时间】:2015-10-08 09:19:49 【问题描述】:我是二年级计算机工程师,仍在学习 C 语言。我想了解如何通过使用函数而不是在 main 中分配来动态分配数组。
这是我在 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));
我很抱歉问了这么愚蠢和显而易见的事情,但我自己没有弄清楚。谢谢你的建议。
【问题讨论】:
a
是一个局部变量,当你返回时,它会超出范围,即在你为其分配内存之后。您需要传入一个指向 int 指针的指针,或者可能更简单,返回新分配的内存。
我在找到我需要的值后忘记释放内存>.
顺便说一句,我喜欢loading
函数。
void f(int x) x = 5; int main(void) int i = 7; f(i); printf("%d\n", i); return 0;
- 你认为这会打印什么,为什么?
@immibis 你没有回报;无效。不确定它会被编译。但答案是 7。因为您更改了值而没有指向 main 中的值。
【参考方案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
【讨论】:
完美!这就是我的想法。但是为什么你传递了地址指针的地址。如果“a”在技术上是数组的地址? @KasparSiricenko 我传递了int *
的地址,这样它就不会在函数终止后超出范围。正如 M.Ohem 在他的评论中所描述的那样 a
是局部变量,因此在返回后它将在函数终止时超出范围
@KasparSiricenko 看看你是否只是传递 a
,它将按值传递,函数中的 p
将是局部变量,因此,在这种情况下,内存不会分配给 a
直到你从函数返回p
。
@KasparSiricenko 但是如果您传递a
的地址(我在示例中所做的事情),那么将在a
地址处存储的值进行更改,因此,内存将分配给a
本身。
@KasparSiricenko 首先要明确数组和指针是不一样的。是的,如果我们传递指针的地址,内存就会分配给main
中的指针本身。【参考方案2】:
你必须改变你的函数返回类型
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);
【讨论】:
谢谢。但我不想退货。 @KasparSiricenko 返回是将堆分配的内存分配给主局部变量a的方法:您必须返回它。以上是关于如何使用指针在另一个函数中分配数组的主要内容,如果未能解决你的问题,请参考以下文章