LINUX.ORG.RU

Запутался с указателями. Си


0

0

В функции set_a() нужно динамически создать и заполнить массив

интеджеров, передав туда адрес переменной, в которой будет этот массив

у меня не получается гдето путаюсь с раскрытием указателей

помогите пожалуйста.

code:

/******************************/

#include<stdio.h>

int **a;

int set_a(int***);

int main(int argc, char **argv)

{ int i; rc=set_a(&a);

return 0;

}

int set_a(int*** i)

{

int rc;

*i =malloc(sizeof(int**))

**i =malloc(sizeof(int));

for(rc =0; rc <5;)

{

**i[rc] =rc;

rc++;

*i =realoc(*i, sizeof(int**) *rc +1);

**i malloc(sizeof(int));

}

return rc;

}

/********************************************/

anonymous

с таким настроением ты слона не продашь..

dilmah ★★★★★
()

А какая РЕАЛЬНАЯ задача функции set_a? Можно по-русски?

И что хотели сказать в строке

**i malloc(sizeof(int));

Что-то очень загадочное. Такое ощущение, что это можно как-то человечнее..

svu ★★★★★
()

Типа, стёб? Хаха, смешно...

Если вопрос задан серьёзно -- хотя бы откомпили то, что проедоставляешь...

Die-Hard ★★★★★
()
Ответ на: комментарий от samson

> kill_my_brain

Да ладно, если бы оно вот так работало: return (1?*&*(int*)NULL:0);

ilya_ost
()

s/нужно динамически создать и заполнить массив интеджеров/нужно динамически скриэйтидь и зафилить эррай интежеров

anonymous
()

>> у меня не получается гдето путаюсь с раскрытием указателей 

Да у тебя вообще в коде какая-то лапша из указателей. Я сомневаюсь что
он вообще компилируется...

>> В функции set_a() нужно динамически создать и заполнить массив
интеджеров, передав туда адрес переменной, в которой будет этот массив

Вот код с комментариями:

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

static const size_t c_ints_num = 15; /* Сколько вешать граммов. */

/* Функция выделения памяти и заполнения массива. */
static void fillArray(int **ints_ptr /* Указатель на указатель на массив. */, size_t num /* Количество элементов. */)
{
        int *ints; /* Чтобы не путаться с указателями на указатель заводим ещё одну переменную - указатель на массив. */

        /* Выделяем память. */
        ints = malloc(sizeof(*ints)*num /* Размер одного элемента, помноженный на количество элементов. */);
        /* Заносим указатель на свежевыделенную память в переменную типа 'int *', на которую указывает ints_ptr. */
        *ints_ptr = ints;

        /* Заполняем массив. */
        for (; num; ++ints, --num) /* Повторяем пока количество оставшихся элементов не нулевое. */
                *ints = rand(); /* Записываем значение элемента. */
}

/* Просто для симметрии. Можно эту функцию и не делать. */
static inline void freeArray(int *ints)
{
        free(ints);
}

int main()
{
        int *ints; /* Указатель на массив. */

        /* Инициализируем ГСЧ для заполнения массива. */
        srand((unsigned int) time(NULL));

        fillArray(&ints /* Передаём указатель на указатель на массив. */, c_ints_num);

        /* Выводим содержимое массива. */
        for (size_t i = 0; c_ints_num > i; ++i)
                printf("Number: %d\n", ints[i]);

        /* Освобождаем массив. */
        freeArray(ints);

        return 0;
}

Только очень прошу - не тупо копипасти этот код, а разберись.

P.S. C99.

Deleted
()
Ответ на: комментарий от svu

>> Я бы во freeArray тоже передавал **, а потом присваивал его NULL. Секурнее;)

Тогда ещё нужно заранее инициализировать ints NULL'ом и ещё проверять что malloc не вернул NULL. Но это пусть уже топикстартер делает =).

Deleted
()

Мне кажется что кто то просто неосилил лабы и хочет чтобы за него все сделали.

imp ★★
()
Ответ на: комментарий от imp

>Мне кажется что кто то просто неосилил лабы и хочет чтобы за него все сделали.

он даже не осилил взять лабы у другой группы? как же он "учиться" будет?

dimon555 ★★★★★
()

> int set_a(int*** i)

Вах! Указатель на указатель на указатель на int -- это где ж такому учат, я извиняюсь?

anonymous
()
Ответ на: комментарий от anonymous

> Указатель на указатель на указатель на int

+++1

samson ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.