Незначительный вопрос выделения памяти C ++ - PullRequest
2 голосов
/ 04 июля 2011
int main() {


  char **k;
  char *s ="abc"; 
  char *b ="def";

  *k = s;


}

// Почему это вызывает ошибку сегментации? Разве все не должно храниться в стеке без проблем?

Ответы [ 3 ]

4 голосов
/ 04 июля 2011

k не имеет определенного значения, поэтому разыменование (*k) вызывает неопределенное поведение. Если вы добавите инициализацию, то есть k = &b;, *k = s; будет работать позже.

2 голосов
/ 04 июля 2011

Хорошо, я надеюсь, что меня не побьют с какой-либо небольшой ошибкой ... вот моя попытка объяснить это настолько полно, насколько смогу.

С обычным символом * он будет указывать на символ.

с символом ** указывает на указатель на символ. Это значение * k находится в куче, а не в стеке.

т.е. как это:

stack (1)    heap (2)   heap or ... (3)
+-----+    +-----+     +----+
|char*| -> |char*| ->  |char|
+-----+    +-----+     +----+

Теперь символы * на самом деле не являются строками, но они обрабатываются как блоки непрерывных печатаемых символов в памяти, которые заканчиваются нулевым или нулевым байтом. Таким образом, строка будет сохранена и на нее будут ссылаться в (3)

Таким образом, чтобы исправить ваш код, вам нужно выделить место для символа * (не символа).

т.е. ставить

k = (char**)malloc(sizeof(char*));

перед строкой

*k = s;

Не то чтобы это хороший код, но он не должен вылетать.

1 голос
/ 04 июля 2011

Александр правильный , вы разыменовываете k с *k = s;. Ваша инициализация char *s="abc"; может выглядеть одинаково, но это синтаксический сахар на более длительный срок: char *s; s="abc";

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...