Что вызывает ошибку сегментации в этом memset ()? - PullRequest
0 голосов
/ 10 февраля 2020

Итак, я знаю, что произошла ошибка сегмента, но я не могу точно определить внутренний лог c за ним. Я считаю, что это потому, что не удалось инициализировать указатель перед доступом к нему. Но что может вызвать это с точки зрения памяти.

ex code:

#include<stdio.h> 

int main(void) 
{ 
  memset((char *)0x0, 1, 100); //What causes this to seg fault
  printf("HELLO POFTUT.COM \n"); 
  return ; 
}

И что может быть решением для этого. Спасибо.

1 Ответ

1 голос
/ 10 февраля 2020

Решение состоит в том, чтобы не записывать в произвольные области памяти: -)

Более подробно, стандартные состояния C11 оператора косвенного обращения *:

Унарный оператор * обозначает косвенность. Если операнд указывает на функцию, результатом является обозначение функции; если он указывает на объект, результатом является lvalue, обозначающее объект. Если операнд имеет тип «указатель на тип», результат имеет тип «тип». Если указателю присвоено недопустимое значение, поведение унарного оператора * не определено.

Этот абзац ссылается на сноску 102, который гласит:

Среди недопустимых значений для разыменования указателя унарным оператором * нулевой указатель, адрес, неправильно выровненный для тип объекта, на который указывает объект, и адрес объекта по истечении срока его жизни.

Обратите внимание, что это не исчерпывающий список , вы, вероятно, все равно попадете в проблема, если вы используете 0x01, а не NULL -эквивалент 0x00. Если вы не знаете , что ваша реализация разрешает доступ (например, адреса ввода-вывода с отображением в памяти), вам действительно нужно писать только по адресам, для которых вы знаете, что существует объект C некоторого описания.

...