Мне нужно выделить несколько массивов одного типа и формы. В начале, я сделал что-то вроде:Выделение нескольких массивов того же типа
void alloc_arrays_v1(size_t nmemb)
{
int *a1, *a2, *a3;
a1 = malloc(nmemb * sizeof int);
a2 = malloc(nmemb * sizeof int);
a3 = malloc(nmemb * sizeof int);
/* do some stuff with the arrays */
free(a1);
free(a2);
free(a3);
}
Чтобы избежать вызова malloc
и free
несколько раз, я изменил выше в:
void alloc_arrays_v2(size_t nmemb)
{
int *a, *a1, *a2, *a3;
a = malloc(3 * nmemb * sizeof int);
a1 = a;
a2 = a1 + nmemb;
a3 = a2 + nmemb;
/* do some stuff */
free(a);
}
Это, кажется, в порядке (в том смысле, что функции вести себя одинаково в реальном случае), но мне интересно, действительно ли это все еще действительный C-код (неопределенное поведение?), и если я могу расширить этот метод до сложного типа данных (массивы структур и т. д.).
Его полностью действительный код C, и да, вы можете сделать это с другими типами, включая структуры (арифметика указателя работает, если вы ее позволяете, и вы позволяете ей просто отлично). Запустите его в отладчике и выполните математику по адресам, начинающимся с 'a', чтобы подтвердить это. – WhozCraig
@WhozCraig: Я делаю это в реальном случае :) – michaelmeyer
Не уверен, что это связано с отладкой, поскольку я отлаживаю * много * кода реального мира. Но его полезно видеть в действии по строчке, шаг за шагом. Не думайте, что отладчики полезны только для поиска ошибок; они являются одинаково фантастическими инструментами для изучения * действительного * кода и просмотра того, как он работает на выбранной платформе. – WhozCraig