2014-01-19 2 views
0

Я играл вокруг указателей и массивов, и я хочу, чтобы бросить/преобразовать указатель на массив Int (выделяется таНосом) для многомерного массива int.Понимания отливки/преобразование указателя на многомерный массив

Не знаю, почему следующие C Программа не печатает одинаковое число два раза.

... 
str->val = malloc(16); 
int (*m)[4][4] = str->val; 
printf("The number is %d, yes the number is %d", str->val[4+1], (*m)[1][1]); 
... 

Теперь первый напечатанный номер является правильным, а второй - нет. Я нашел другой вопрос о SO, подобный моему, но я не мог решить свою проблему. Прошу прощения за возможное дублирование.

У меня есть еще один вопрос: в чем разница между следующими объявлениями?

int m[10]; 
int (*m)[10]; 

EDIT:

Моя проблема вызвана неправильной декларации поля валь моего структуры: Я сказал, что она полукокса.

+1

может оказаться полезным http://www.unixwiz.net/techtips/reading-cdecl.html – tesseract

+1

таНос (16) будет только выделить достаточно памяти для int array [0] [4]. – tesseract

ответ

2

Использование хорошего инструмента cdecl.org, int (*m)[4][4] переведено на declare m as pointer to array 4 of array 4 of int, что является многомерным массивом. Он должен работать, если вы выделили больше памяти.

int m[10]; - это массив из 10 целых чисел, уложенных как строка в памяти. int (*m)[10]; - указатель на массив, содержащий 10 значений.

int m[4][5] - многомерный массив, но они почти как int m[20]. Они складываются как строка в памяти. Индексирование m[2][0] просто переведено на m[5*2 + 0].

int *m[5] НЕ многомерный массив, это массив указателей. Каждый указатель указывает на другой массив. Значения не сохраняются в последовательности.

1

Ваша проблема в том, что для вашего массива недостаточно 16 байт. Общие значения sizeof(int) - это 2 и 4, поэтому вам нужно как минимум 32 или 64 байта для представления 4 int с. Но вы не должны вставлять в свой код жесткие проводники. Используйте оператор sizeof, и он будет работать:

int (*arr)[4][4] = malloc(sizeof(*arr)); 
int *ptr = &(*arr)[0][0]; 

// fill it with something, then: 

printf("%d = %d\n", (*arr)[1][1], ptr[1 * 4 + 1]); 
Смежные вопросы