Что является проблемой с интервалом *p; *p=23;

Вчера в моем интервью меня задали этот вопрос. (В то время я был высоко герметизирован таким количеством резких вопросов).

int *p;
*p=23;
printf("%d",*p);

Есть ли какая-либо проблема с этим кодом?

Я объяснил его, что Вы пытаетесь присвоить значение указателю, кому не выделяется память.

Но способ, которым он реагировал, это было похоже, я неправ. Хотя я получил задание, но после этого он сказал, что Mohit думают об этом вопросе снова. Я не знаю то, что он пытался сказать. Сообщенный мне там какая-либо проблема в моем ответе?

ОТРЕДАКТИРУЙТЕ я добавил код листа; -

int *p;
p=malloc(sizeof(int));
*p=23;
printf("%d",*p);      

Это должно быть идеальным кодом... Действительно ли я прав..

EDIT2

int *p;
*p=23;
 OR
int *p=23;

Я думаю, что у обоих есть проблема. Вызовите некоторое тело, говорит о заголовке сообщения.

15
задан Mohit Jain 29 March 2010 в 16:06
поделиться

7 ответов

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

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

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

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

28
ответ дан 1 December 2019 в 00:07
поделиться

p не инициализирован - он сохраняет некоторый адрес . Разыменование - неопределенное поведение.

Адрес, хранящийся в p , может быть отображен в адресное пространство процесса или может не отображаться. Если он отображается, то по этому адресу хранятся не связанные между собой (но, возможно, важные для программы) данные. Таким образом, либо ваша программа немедленно вылетает из-за защиты памяти, либо вы изменяете некоторые данные, принадлежащие программе. Последствия последнего могут быть разными - может ничего не происходит, может быть, вы не замечаете, может быть, вы повредили важные данные, и программа развалится - классическое неопределенное поведение.

14
ответ дан 1 December 2019 в 00:07
поделиться
#include <stdio.h>
#include <stdlib.h>

int main(char** argv) {
  // THIS POINTER IS NOT DECLARED (SO IT'S NOT USABLE/INVALID)
  int *p;
  // 1) SO RESERVE MEMORY AND SET POINTER TO VALID MEMORY...
  p=malloc(sizeof(int));
  // 2) ...CHECK IF ALLOCATION WAS OK...
  if (p) {
    *p=23;
    printf("%d",*p);
  } else printf("sorry, no memory");
  // 3) ...AND FINALLY DE-ALLOCATE MEMORY (FREEING IS IGNORED WHEN p IS NULL)!
  free(p);
}
3
ответ дан 1 December 2019 в 00:07
поделиться

Кроме Тот факт, что пример не выделяет память для значения 23, он также не будет компилироваться в первую очередь, потому что у вас есть два символа в вашей characted константе (которая должна быть строкой). Например, замените "% d" на "% d" в инструкции printf.

0
ответ дан 1 December 2019 в 00:07
поделиться

int * p;

изначально указанный выше указатель содержит какое-то мусорное значение (недопустимое значение адреса или нераспределенный адрес).

* p = 23;

, то ваша попытка поместить какое-то значение (23) в недопустимую память приводит к неопределенному поведению.

2
ответ дан 1 December 2019 в 00:07
поделиться

int * p = 23;

Это совершенно другое. Здесь вы объявляете указатель и присваиваете ему значение 23. Это означает, что теперь он указывает на ячейку памяти 23, которая может содержать или не содержать читаемые данные.

Но простое присвоение указателю произвольного значения без его разыменования совершенно безопасно.

3
ответ дан 1 December 2019 в 00:07
поделиться

«p» указывает на неизвестное местоположение, а не на «нераспределенную» память.

Разница в том, что поскольку он не определен, он может указывать на выделенную память, даже если эта память не предназначена для доступа этой функции.

7
ответ дан 1 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: