【问题标题】:How to pass arrays to a function in C如何将数组传递给C中的函数
【发布时间】:2019-01-14 10:33:57
【问题描述】:

我在 main 函数中取了一个数字,在 make_array 函数中把它变成一个数组。在palindrome 函数中,我需要检查我在make_array 函数中创建的数组,但它在palindrome 函数中不可见。

我该如何解决这个问题?

#include<stdio.h>
#define N 5

void make_array(int n);
int palindrome(int ar[],int size);

int main()
{
    int num;
    printf("Enter a number to check: ");scanf("%d",&num);

    make_array(num);

    if(palindrome(/*Don't know what should I write here*/))
         printf("It is palindrome");

    else
         printf("It is not palindrome");
}

void make_array(int n)
{
    int arr[N];
    int digit,i=0;

    while(n>0){
        digit=n%10;
        arr[i]=digit;
        n/=10;
        i++;
    }

    printf("Array: ");
    for(i=0; i<N; i++)
        printf("%d ",arr[i]);
}

int palindrome(int ar[],int size)
{
    int i,j;
    int temp[N];
    j=N;

    for(i=0; i<N; i++)
        temp[i]=ar[i];


    for(i=0; i<N; i++){
        if(temp[j-1]!=ar[i])
            return 0;
        j--;

    }


    return 1;

}

【问题讨论】:

  • 函数返回时局部变量消失。要么将数组传递给make_array() 函数,要么让它动态分配数组并返回指向它的指针。无论哪种方式都可以改变。
  • 有几个问题,make_array 只是在栈上创建一个数组,当你离开函数时,它会从栈中弹出,不再存在。将你的数组从 make_array 移动到应用程序的全局,然后你可以在离开 make_array 后访问它。

标签: c arrays function


【解决方案1】:

最好的方法是将分配留给调用者。然后你可以简单地做

int main()
{
    int num;
    printf("Enter a number to check: ");scanf("%d",&num);

    int array[num];

    fill_array(num, array);

fill_array 在您的代码中执行“make_array”的操作,但减去分配部分。

void fill_array(int num, int array[num]);

回文函数可以类似地重写:

int palindrome(int size, int array[size])

所有这些都使用了可变长度数组 (VLA) 的概念。

【讨论】:

  • 看起来数组包含数字,所以“输入要检查的数字:”应该返回 123,您将分配一个 123 个大元素的数组,但实际上只需要 3 个。
【解决方案2】:

我对你的代码做了一些修改,请参考。

#include<stdio.h>
#include "stdafx.h"

#define N 5

int make_array(int n, int *arr);
int palindrome(int ar[],int size);

int main()
{
    int num;
    int arr[N];
    int iRet;

    printf("Enter a number to check: ");scanf_s("%d",&num);

    iRet = make_array(num, arr);

    if(palindrome(arr, iRet))
         printf("It is palindrome");

    else
         printf("It is not palindrome");
}

int make_array(int n, int *arr)
{
    //int arr[N];
    int digit,i=0;

    while(n>0){
        digit=n%10;
        arr[i]=digit;
        n/=10;
        i++;
    }

    printf("Array: ");
    for(int j=0; j<i; j++)
        printf("%d ",arr[j]);

    return i;
}

int palindrome(int ar[],int size)
{
    int i,j;
    int temp[N];
    j=size;

    for(i=0; i<size; i++)
        temp[i]=ar[i];


    for(i=0; i<size; i++){
        if(temp[j-1]!=ar[i])
            return 0;
        j--;

    }


    return 1;

}

【讨论】:

  • 为了增强您的答案,请添加一些说明,说明您的代码如何解决 OP 的问题以及导致他的问题的原因。仅提供代码可能还不够。
【解决方案3】:

问题在于您的 make 数组函数。调用函数时,堆栈会向下增长并分配寄存器和指针以保存调用该函数的点,现在,在这里您按值发送 n 并且您的函数在堆栈上为您填充的数组创建一个位置- 但是 - 当你的函数返回时 - 堆栈指针返回给调用者(如果你的函数有返回值,它将被保存在预先分配的位置,但除此之外,堆栈上的所有其他函数数据都不可用.).

所以一般来说,如果你想让一个函数创建一个以后可以使用的数组,它必须在堆上分配,你可以返回 int* 或发送 foo(int**) 到将保存添加的函数.新分配的数组。

另一种选择是在你的 main 中分配该数组 [N],并将 foo(int arr[], int n, size_t size) 发送给函数。由于数组是由调用者在 main 中分配的,因此该内存将在所有 main 函数生命周期内有效。

所以选项 1)

int main()
{
 int num;
 int* array;
 printf("Enter a number to check: ");scanf("%d",&num);
 array = make_array(num, N);

 if(palindrome(array, N))
     printf("It is palindrome");

 else
     printf("It is not palindrome");

 free(array); /*free heap allocation */
}


int* make_array(int n, size_t size)
{
int* arr;
int digit ,i=0; 

arr = malloc(sizeof(int)*size);
if(NULL == arr)
{
   return NULL; /* malloc failed*/
}
while(n>0 && i<size){
    digit=n%10;
    arr[i]=digit;
    n/=10;
    i++;
}

printf("Array: ");
for(i=0; i<N; i++)
    printf("%d ",arr[i]);

 return arr;
 }

或 2)

int main()
{
int num;
int array[N];/*array saved on stack in main function */
printf("Enter a number to check: ");scanf("%d",&num);

make_array(array,num, N);

if(palindrome(/*Don't know what should I write here*/))
     printf("It is palindrome");

else
     printf("It is not palindrome");
}



void make_array(int* arr, int n, size_t size)
{

int digit,i=0;

if(NULL == arr)/*if arr is not a valid pointer*/
{
   return;
}
while(n>0 && i<size){
    digit=n%10;
    arr[i]=digit;
    n/=10;
    i++;
}

printf("Array: ");
for(i=0; i<N; i++)
    printf("%d ",arr[i]);
}

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 2011-03-14
    • 2018-11-14
    • 2012-07-25
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多