2015-02-16 3 views

ответ

1
uint64_t *var1 = NULL; 
char *var2 = NULL; 

Вы определили указатели var1 и var2 типа uint64_t и полукокса, соответственно, которые указывают на NULL. И в этом шаге

var1 = (uint64_t *) var2; 

вы пытаетесь сделать свой var1, чтобы указать на то же место, что и var2 и приведения его в uint64_t.So из двух вышеупомянутых разделов var1 и var2 указывают на NULL указатель ИЭ ничего простого.

*var1 = 0;

в этой линии вы пытаетесь присвоить значение 0 в место, указанного var1, который является Null местоположения т.е. ошибочный адрес и де-ссылка на недопустимый/Null адреса приведет к аварии.

Перед назначением значения вам необходимо выделить память и указать указатели на это место памяти, а затем присвоить значение.

var1 = malloc(sizeof(uint64_t)); 
*var1 = 0; 

Это должно заставить ваш код работать.

2

Можно ли это исправить, если я переназначить * var1 в NULL снова

Указатель следует указать на уважительной ячейку памяти, прежде чем писать что-то на него. В вашем случае вы этого не делаете, поэтому у вас есть ошибка сегментации (или сбой). Итак, прежде чем писать что-либо в память, память памяти должна быть выделена указателю.

uint64_t *var1 = malloc(sizeof(uint64_t)); 
+0

Благодарим за описание (комментарии). Это очистило мои сомнения. – user3269606

1

Вы, наверное, не понимают, что * в объявлении указателя и * в выражении указатель арифметики означать совершенно противоположные вещи.

uint64_t *var1 = NULL; это объявляет uint64_t указатель (тип uint64_t*)

*var1 = 0;это разыменовывает указатель, то есть доступ к памяти хранятся на его адрес. Он не дает указателю новое значение. Он изменяет указанные данные. И в этом случае нет указательных данных. NULL не может указывать на данные. Отсюда и ошибка.

Если вы хотите изменить значение указателя, просто сделать

var1 = 0;

Я извиняюсь, если я неправильно понял намерения в вашем вопросе. В этом случае, если вы хотите изменить значение привязанных данных, ну, сначала укажите указатель на некоторую записываемую память!

uint64_t var = 100; 
/* ... */ 
var1 = &var; /* Get a pointer to the memory that is the variable var */ 

или

uint64_t *var1 = malloc(sizeof(uint64_t)); /* Allocate memory for one uint64_t on the heap and set var1 to point at it */

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