У меня есть следующий фрагмент кода, который дает мне ошибку сегментации.
#include <stdio.h>
#include <stdlib.h>
struct node {
unsigned int n1;
unsigned int n2;
};
int main() {
struct node *nd = (struct node *)malloc(24356 * sizeof(struct node));
for(int i=0; i < 24356; i++) {
nd[i * sizeof(struct node)].n1 = i;
nd[i * sizeof(struct node)].n2 = i+1;
}
return 0;
}
Когда я провел некоторую отладку, я обнаружил, что цикл for выполнялся около 3000 раз, а затем в этой строке возникает ошибка сегментации:
nd[i * sizeof(структурный узел)].n1 = i;
Я не мог понять, что не так в этом коде. Не может malloc() выделить объем памяти (~ 190 КБ), который я прошу выделить? Если да, то почему он не возвращает NULL?
Эти строки являются проблемой:
nd[i * sizeof(struct node)].n1 = i;
nd[i * sizeof(struct node)].n2 = i+1;
Измените их на:
nd[i].n1 = i;
nd[i].n2 = i+1;
Помните, что индексы не являются байтовыми смещениями. Это индексы элементов. Компилятор автоматически масштабирует их по размеру элемента.
Я не мог понять, что не так в этом коде. Не может malloc() выделить объем памяти (~ 190 КБ), который я прошу выделить? Если да, то почему он не возвращает NULL?
В вашей интерпретации использования malloc есть несколько недоразумений, которые делают ваш код неверным:
Выражение, которое вы используете внутри индекса массива, может принимать значения только от 0 до 24355 и не более.
Изменять
nd[i * sizeof(struct node)].n1 = i;
к
nd[i].n1 = i;
Поскольку массивы должны быть проиндексированы по положению элемента, а не по адресу элемента (относительно источника массива)
Это не то, как работают массивы. Нет никакой разницы в доступе к массиву
int
, выделенному malloc, и к любому другому массиву int.