Как передать массивы в функцию в C - PullRequest
0 голосов
/ 14 января 2019

Я беру число в основной функции, делаю его массивом в функции 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;

}

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Я сделал некоторые изменения в вашем коде, поэтому, пожалуйста, обратитесь к нему.

#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;

}
0 голосов
/ 14 января 2019

Проблема с вашей функцией make array. Когда вызывается функция, стек уменьшается, и регистры и указатели выделяются для сохранения точки, из которой была вызвана эта функция, теперь вы отправляете n по значению, а ваша функция создает место в стеке для заполненного вами массива. - НО - когда ваша функция возвращается - указатель стека возвращается обратно к вызывающей стороне (если ваша функция имеет возвращаемое значение, она будет сохранена в заранее выделенном месте, но кроме этого все остальные данные функции в стеке недоступны .).

Таким образом, в общем, если вы хотите, чтобы функция создала массив, который можно было использовать позже, он должен быть размещен в куче, вы можете либо вернуть int *, либо отправить foo (int **) в функцию, которая будет содержать add , нового выделенного массива.

другой вариант - выделить этот массив [N] в вашем main и отправить функцию foo (int arr [], int n, size_t size). Поскольку массив был выделен вызывающей стороной в 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]);
}
0 голосов
/ 14 января 2019

Лучший способ - оставить выделение вызывающей стороне. Тогда вы можете просто сделать

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...