C - динамические массивы - PullRequest
3 голосов
/ 07 марта 2011

Я не совсем понимаю, как работают указатели с массивами Си. Вот код, который я получил:

int arrayOne[] = {1, 2, 3};
int arrayTwo[] = {4, 5, 6, 7};

int **arrayThree = (int **)malloc(2 * sizeof(int));
arrayThree[0] = arrayOne;
arrayThree[1] = arrayTwo;

for (int i = 0; i < 2; i++) {
    int *array = arrayThree[i];
    int length = sizeof(array) / sizeof(int);
    for (int j = 0; j < length; j++)
        printf("arrayThree[%d][%d] = %d\n", i, j, array[j]);
}

Я бы ожидал, что это выведет следующее:

arrayThree[0][0] = 1
arrayThree[0][1] = 2
arrayThree[0][2] = 3
arrayThree[1][0] = 4
arrayThree[1][1] = 5
arrayThree[1][2] = 6
arrayThree[1][3] = 7

То, что он на самом деле печатает:

arrayThree[0][0] = 1
arrayThree[0][1] = 2
arrayThree[1][0] = 4
arrayThree[1][1] = 5

Почему?!

Ответы [ 4 ]

11 голосов
/ 07 марта 2011

sizeof(array) - это размер указателя, который в два раза больше, чем int на вашей платформе.

Нет способа получить длину массива в C.Вы просто должны запомнить это сами.

4 голосов
/ 07 марта 2011

Прежде всего, int **arrayThree = (int **)malloc(2 * sizeof(int)) не так, должно быть sizeof(int *)

Далее sizeof(array) / sizeof(int) соответствует sizeof(int *) / sizeof(int), а это не то, что вам нужно.

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

1 голос
/ 07 марта 2011

Существует нет встроенного механизма , чтобы отслеживать размер массива в C, вам нужно сохранить его самостоятельно и передать его любой функции, которая принимает ваш массив в качестве параметра.*

Однако , если вам действительно нужно интенсивно и динамически использовать массивы в C, вы можете создать свою собственную библиотеку динамических массивов в C без особых усилий.Для получения дополнительной информации обратитесь к следующему учебнику: goo.gl/vYhkF.

0 голосов
/ 07 марта 2011

Прежде всего, распределение arrayThree должно составлять

int **arrayThree = malloc(2 * sizeof *arrayThree);

Поскольку тип arrayThree равен int **, тип *arrayThree равен int *.

Причина, по которой sizeof (array) / sizeof (int) не возвращает ожидаемого, заключается в том, что array является указателем (тип int *), а не типом массива, поэтому sizeof возвращает число байты, содержащиеся в самом указателе объект , а не количество указанных элементов.

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

...