Путать с & * и [] () с динамическими массивами в C - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть код на C с этими строками:

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

    for (i = 0; i <= 20; i++){
        serie=rand(); 
        printf("%d ",&serie[i]);/* *serie */
    }

Это работает, но я хочу знать, почему, с помощью malloc, я считаю, что я создаю динамический массив или указатель с именем serie, пока мои знания:

& returns the address
* returns the content of the adress

С фиксированными массивами вы используете [] и с указателями ()

При тестировании &serie[i], кажется, работает, но это не *serie(i) или *serie[i] и *serie Я думаю, что это не так.

Может кто-нибудь объяснить мне это?

Если я хотел напечатать содержимое, я не должен ставить * вместо &, я думаю, что с динамическими массивами вы используете [] вместо (), так что это должно быть *serie[i] не &serie[i]?

Ответы [ 5 ]

5 голосов
/ 15 декабря 2011

В этом коде serie - это указатель на целое число .Строка с malloc() выделяет для нее место, так что установка или получение целого числа для *serie будет работать.Цикл, кажется, неправильно устанавливает возвращаемое значение rand() (целое число) в serie.Эта конкретная строка в вашем текущем коде должна выглядеть следующим образом (но в любом случае это не то, что вам нужно):

*serie = rand();

Поскольку rand() возвращает целое число, а один serie является указателем на целое число,Тем не менее, *serie - это целое число, которое вы можете установить.

В printf() вы пытаетесь получить доступ к serie как массив, но это не сработает, потому что вы тольковыделен один элемент.Ну, это будет работать, но только для нулевого элемента.

Если вы пытаетесь установить и сгенерировать 20 случайных элементов (но с использованием «динамического» массива), вы можете захотеть что-то вроде этого:

int i;
// note allocating the proper number of elements
int *serie = malloc(sizeof(int) * 20);

// note starting at and going < 20 for 20 elements
for (i = 0; i < 20; i++) {
    serie[i] = rand();
    printf("%d ", serie[i]); // *(serie + i) will also work here
}

Обратите внимание, что всякий раз, когда вы используете квадратные скобки для доступа к элементу, он разыменовывает его, так же как и *.Так что serie[i] и *(serie + i) функционально эквивалентны.

1 голос
/ 15 декабря 2011

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

Выделенная память вообще не используется, так как serie позднее переназначается на случайную ячейку памяти (помните, serie - это указатель на int, а не на int, поэтому rand () назначает случайный адрес памяти).

Синтаксис массива разыменовывает указатель на значение, как и звездочка. serie - указатель на int. *serie и serie[0] оба являются ЗНАЧЕНИЕМ в месте, указанном serie. serie[i] - это целочисленное значение в местоположении i, оно больше не является указателем.

&serie[i] печатает адрес целого числа, которое i дюймов от случайного местоположения. *serie[i] пытается разыменовать указатель дважды, один раз в скобках и снова звездочкой, что, вероятно, не то, что вы хотели.

1 голос
/ 15 декабря 2011
With fixed arrays you use [] and with pointers () 

Неверно.Вы можете использовать один и тот же синтаксис как для указателей, так и для фиксированных массивов.

Чтобы получить значение элемента i: th в серии массива, вы можете написать:

serie[i]

или

*(serie + i)
0 голосов
/ 15 декабря 2011

Это выглядит ужасно разбито:

  1. serie=rand(); присваивает целое число (возвращаемое значение rand()) целочисленному указателю, вряд ли разумное или правильное действие.
  2. &serie[i] читает случайную память, так как вы перезаписали указатель случайным числом.
0 голосов
/ 15 декабря 2011

* serie - это просто еще одно название для serie [0]. * (серия + 1) - другое название серии [1]. Они оба компилируются в один и тот же машинный код. Используйте все, что делает ваш собственный код наиболее читабельным. Массив объектов? Используйте []. Указатель на строку? Используйте *.

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