Изменить массив Dynami c с помощью функций - PullRequest
0 голосов
/ 12 апреля 2020

У меня возникли некоторые проблемы при работе с динамическими c массивами ... в следующем коде я пытаюсь поместить каждый di git из n в массив с именем digitList. Это работает нормально, потому что я могу напечатать каждое значение в массиве из CALL 1 (внутри функции createDigitList), но я не могу из основного. Что я делаю не так ???

int main(int argc, char **argv)
{
    int n = 1234;
    int *digitList;

    createDigitList(n, digitList);
//CALL 2 PRINTF
    printf("Call 2: %d \n", digitList[2]);

    return 0;
}

//returns number of digits (works OK)
int nDigits(int n) {
    int unit;
    int digit = 0;
    while (n != 0) {
        unit = n % 10;
        n = (n - unit )/ 10;
        digit++;
    }
    return digit;
}

//Allocates memory for list and puts every digit inside the array list
void createDigitList(int n, int list[]) {
    int digit, i;
    list = (int*) malloc(nDigits(n)*sizeof(int));
    for (i = nDigits(n)-1; i >=0; i--) {
        digit = n % 10;
        list[i] = digit;
        n = (n - digit )/ 10;

    }
//CALL 1 PRINTF
    printf("Call 1: %d \n", list[2]);
}

Вывод:

Call 1: 3
Call 2: -2063401279

Заранее всем спасибо!

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Чтобы понять это в деталях, нужно понимать концепции передачи аргументов языка C. Нужно понимать Переменная Scope и Pass by value против Pass by Reference различия. Вот небольшое вступление , на котором

Кроме того, вот один из способов переписать вашу программу в рабочую.

int *createDigitList(int n);
int nDigits(int n);

int main(int argc, char **argv)
{
    int n = 1234;
    int *digitList;

    digitList = createDigitList(n);
//CALL 2 PRINTF
    printf("Call 2: %d \n", digitList[2]);

    return 0;
}

//returns number of digits (works OK)
int nDigits(int n) {
    int unit;
    int digit = 0;
    while (n != 0) {
        unit = n % 10;
        n = (n - unit )/ 10;
        digit++;
    }
    return digit;
}

//Allocates memory for list and puts every digit inside the array list
int *createDigitList(int n) {
    int digit, i;
    int *list;
    list = (int*) malloc(nDigits(n)*sizeof(int));
    for (i = nDigits(n)-1; i >=0; i--) {
        digit = n % 10;
        list[i] = digit;
        n = (n - digit )/ 10;

    }
//CALL 1 PRINTF
    printf("Call 1: %d \n", list[2]);
    return list;
}
0 голосов
/ 12 апреля 2020

Вы должны передать указатель digitList по ссылке на функцию createDigitList

createDigitList(n, &digitList);

В противном случае функция будет иметь дело с копией указателя. Изменение копии не влияет на исходный указатель.

Сама функция должна быть объявлена ​​как минимум как

int createDigitList(int n, int **list) {
    int digit, i;
    *list = (int*) malloc(nDigits(n)*sizeof(int));
    //  and so on

Функция должна возвращать размер выделенного массива. В противном случае вызывающая функция не будет знать, сколько элементов содержит массив.

Обратите внимание на то, что функция nDigits также неверна, поскольку в случае, когда ноль будет передан действительной функции число функция вернет 0 вместо 1.

Также программа будет некорректно работать, когда пользователь введет отрицательное число. Имеет смысл написать функцию, которая преобразует целое число в строку. В этом случае строка результата может содержать знак минус.

Вот демонстрационная программа, которая показывает, как можно написать такую ​​функцию.

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

size_t nDigits( int n ) 
{
    const int Base = 10;

    size_t count = 0;

    do { ++count; } while ( n /= Base );

    return count;
}

char * createDigitList( int n )
{
    const int Base = 10;
    size_t count = nDigits( n ) + ( n < 0 );

    char *s = calloc( count + 1, sizeof( char ) );

    if ( s != NULL )
    {
        if ( n < 0 ) s[0] = '-';

        do
        {
            int digit = n % Base;
            if ( digit < 0 ) digit = -digit;

            s[--count] = digit + '0';
        } while ( n /= Base );
    }

    return s;
}

int main(void) 
{
    printf( "%d is \"%s\"\n", 0, createDigitList( 0 ) );
    printf( "%d is \"%s\"\n", INT_MIN, createDigitList( INT_MIN ) );
    printf( "%d is \"%s\"\n", INT_MAX, createDigitList( INT_MAX ) );

    return 0;
}

Вывод программы:

0 is "0"
-2147483648 is "-2147483648"
2147483647 is "2147483647"
...