Динамическое выделение памяти для треугольной двумерной матрицы - PullRequest
1 голос
/ 11 июля 2011

Я хочу инициализировать двумерный массив таким образом, чтобы в каждой строке было разное количество элементов.Более того, количество элементов в строке зависит от количества элементов в предыдущей строке.Например, функция, управляющая количеством элементов в строке, будет:

Rows(N)= 2*Rows(N-1) +1 

, где Rows (N) - количество ячеек в N-й строке.

Проблема может бытьрешается легко, если я могу найти размер массива.Например, я попытался:

int A[10];

, тогда его размер sizeof(A)/sizeof(int), он дает мне 10. (правильно)

Но если я выделю память как:

int *A;
A=(int *)malloc(sizeof(int)*10);

и затем проверьте значение sizeof(A)/sizeof(int), оно дает мне 1. (неправильно) Итак, этот подход здесь не работает.

Может кто-нибудь помочь мне в этом.

Ответы [ 3 ]

3 голосов
/ 11 июля 2011

Хотя вы можете обращаться к динамической памяти как к массиву в C, она имеет другую семантику.Когда вы спрашиваете sizeof(A)/sizeof(int), вы на самом деле спрашиваете sizeof(int *)/sizeof(int).Поскольку эти две величины равны (например, оба 32-разрядных), ответ будет 1.

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

0 голосов
/ 11 июля 2011

Ваш A является int*.Массивы действительно являются просто указателем на первый элемент непрерывного блока памяти, информация о размере не связана.Это означает, что sizeof(A) - это размер отдельного элемента.

Поскольку у вас уже есть размер массива, ваш код должен нормально с ним работать.

0 голосов
/ 11 июля 2011

Либо вы считаете элементы в вашем массиве с помощью цикла.

или дано

int *A; A=(int *)malloc(sizeof(int)*10);

кажется, что вы уже знаете размер (10), поэтому, пока вы создаете оставшуюся часть массива, используйте переменную, чтобы отслеживать количество элементов, которые нужно перейти в следующую строку.

...