2012-02-09 2 views
0
#include <stdio.h> 
#include <stdlib.h> 
#define MAX 10 
void main() 
{ 
int *ptr, *arr[MAX]; 
int i, j; 
for (i=MAX-1; i>=0; i--) 

if (arr[i]=(int*)malloc(i*sizeof(int))) // <= that line! 

for (j=0; j<i; j++) 
*(*(arr+i)+j) = j*i; 

ptr = *(arr+MAX-1); 
while (*ptr)  
printf ("%d ", *ptr--); 
} 

Я не понимаю, что цель этой команды:Какова цель этого раздела кода?

arr[i]=(int*)malloc(i*sizeof(int)) 

Я знаю, что это таНос динамическое распределение. Но что имеется в виду при arr [i], он дает sizeof * i? Спасибо.

+0

Эмм, я полагаю, вы пытались подчеркнуть оператор if в коде? (используя ** **) Вы можете удалить это. Редактировать: Спасибо @NiklasB – Bart

+0

Yikes! Вы понимаете, что у вас есть один оператор, охватывающий 6 строк (2 из них пустые) вашего кода? Я предлагаю вам разбить это утверждение на более мелкие высказывания. – pmg

+0

http://en.wikipedia.org/wiki/Triangular_matrix –

ответ

0

Он выделяет все более длинные массивы как каждый элемент обр. поэтому arr [0] указывает на массив размера 0, arr [2] указывает на массив из 2 int и так далее.

2

Команда, о котором вы говорите выделяет блок длины, достаточные для хранения i элементов типа int, и сохраняет результат на i -й позиции в массиве указателей, называемых arr. Программа создает «треугольный» массив arr: его элементы представляют собой массивы разной длины, размещенные в таком порядке, что arr[i] может содержать i элементов.

Кстати, этот код не имеет кодов для free для предметов, которые он выделил.

0

arr - массив указателей на int. Каждый его элемент - arr[x] - это указатель на int, поэтому массив. Это массив массивов ints.

Для каждого элемента массива создается массив с размером текущего индекса.

Обратите внимание, что ваш код является незаконным, поскольку, когда i==0, вы позвоните malloc(0).

Кроме того, рекомендуется не применять возвращаемый тип malloc.

1
int *ptr, *arr[MAX] 

создает указатель на int и массив с MAX элементами указателей на int.

arr[i]=(int*)malloc(i*sizeof(int)) 

Распределяет пространство для i Интс для каждого указателя Int.

1

Сначала sizeof() «возвращает» (он должен быть заменен числовым значением во время компиляции), размер предоставленного типа. Средство 4 для int (машины 8 на 64b), 1 для char и так далее.

Поэтому i*sizeof(int) означает размер для i ints (i = 4; sizeof(int) = 4;, а не 16).

malloc() использует количество байтов для выделения в качестве параметра, поэтому malloc(16) выделяет 16 байт, достаточно места для 4 4B целых чисел.

(int*) просто что-то вроде C-хак иметь правильные типы (потому что вы хотите использовать эти 16B, как int[4] не как void *).

Весь код означает выделение пространства для i ints на i-м месте массива (1 на первом, 2 на втором ...).Тем не менее, я блуждаю, что будет на 0, когда вы попытаетесь выделить 0 байт :)

Смежные вопросы