2017-01-11 5 views
1

Почему не следующая работа инициализации массива длинных длинных целых чисел в C:2D синтаксис инициализации в C

int **m = malloc(n * sizeof(int *)); 
for (int i = 0; i < n; i++) m[i] = malloc(n * sizeof(long long int)); 

работать он должен быть:

long long int **m = malloc(n * sizeof(long long int *)); 
for (int i = 0; i < n; i++) m[i] = malloc(n *sizeof(long long int)); 

Я не» t понять, почему указатель на long long ints не вписывается в int? Это просто адрес, не так ли?

+2

указатели «подходят», но интерпретация указателей не так, так что все ад. –

+0

Почему, по вашему мнению, это не работает? – immibis

+0

Указатель - это просто указатель, почему он должен принимать столько битов, сколько long int * вместо просто int *? –

ответ

2

Ни один из 2 фрагментов в вашем вопросе не инициализирует массив of long long int s.

  • Вы просто выделить массив указателей на массивы int из long long int соответственно, но ни один из них не инициализирован.
  • Первый фрагмент несогласован, поскольку вы выделяете память для массивов второго уровня размером n * sizeof(long long int) вместо n * sizeof(int), но это не вызовет проблем, так как long long int не может быть меньше int.
  • Второй фрагмент более согласован, но вы должны использовать тип size_t для индекса i для полной согласованности.

указатель на длинный длинный ints не помещается в int? Это просто адрес, не так ли?:

  • Нет, указатели действительно содержат адреса, но может быть больше, чем int. Большинство 64-битных систем имеют 32-разрядные int и 64-разрядные указатели.

Вот более надежные способы выделить и инициализировать 2D псевдо массивы:

// allocate and initialize the 2D indirect array 
long long int **m = malloc(n * sizeof(*m)); 
for (size_t i = 0; i < n; i++) { 
    m[i] = calloc(n, sizeof(*m[i])); 
} 

// allocate and initialize a 2D indirect array with a single chunk 
long long int **m = malloc(n * sizeof(*m)); 
m[0] = calloc(n * n, sizeof(*m[0])); 
for (size_t i = 1; i < n; i++) { 
    m[i] = m[i - 1] + n; 
} 

// allocate and initialize a flat 2D array: 
long long int m[n][n] = calloc(1, sizeof(m)); 
2

Это не размер указателя, это тип, связанный с ним. Когда распределение завершено, что полностью нормально, до тех пор, пока вы используете m в качестве матрицы int с, вы в конечном итоге написать что-то вроде этого:

long long int myLongLongInt = 1234567; 
m[row][col] = myLongLongInt; 

Это где проблема, потому что m[row][col] является lvalue цельного типа, а не long long int type. Два смежных элемента из строки m: sizeof(int), а не sizeof(long long int). Следовательно, назначение будет работать неправильно.

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

  • Нет связанных вопросов^_^