В чем проблема с int * p; * Р = 23;
Вчера в моем интервью мне задали этот вопрос. (В то время у меня было сильное давление со стольких крутых вопросов).
int *p;
*p=23;
printf("%d",*p);
Есть ли какие-либо проблемы с этим кодом?
Я объяснил ему, что вы пытаетесь присвоить значение указателю, которому не выделяется память.
Но как он реагировал, это было похоже на то, что я ошибаюсь. Хотя я получил работу, но после этого он сказал, что Мохит снова задумался над этим вопросом.
Я не знаю, что он пытался сказать. Пожалуйста, дайте мне знать, есть ли какие-либо проблемы в моем ответе?
ИЗМЕНИТЬ
Я добавил код на листе,
int *p;
p=malloc(sizeof(int));
*p=23;
printf("%d",*p);
Это должен быть идеальный код... Am я right..
EDIT2
int *p;
*p=23;
OR
int *p=23;
Я думаю, что у обоих есть проблемы. Потому что какой-то орган говорит о названии сообщения.
Ответы
Ответ 1
", пытаясь присвоить значение указателю, которому не выделена память"
Я думаю, вы просто немного ошибочно это сделали. Вы не пытаетесь присвоить значение указателю, вы пытаетесь присвоить значение указателю указателя.
Поскольку указатель не инициализирован, это, как вы говорите, поведение undefined. Указатель не ссылается ни на что (по крайней мере, недействительно), как указывают другие ответы, биты памяти p
могут просто содержать значение, которое является адресом некоторой ячейки памяти, и ваш код может быть перезаписан что. Стандарт позволяет что-то случиться с UB, но, зная что-то о вашей реализации, вы часто можете проницательно догадаться).
Так что, вероятно, в интервьюерском уме у вас есть правильная идея, но важно иметь это прямо в вашем уме и в вашей речи, какая разница между пальцем и луной, и о котором вы говорите.
Ответ 2
p
не инициализируется - он сохраняет некоторый адрес. Выражение разыменования - это поведение undefined.
Адрес, хранящийся в p
, может быть отображен в адресное пространство процесса или может не отображаться. Если он сопоставлен с некоторыми несвязанными (но, возможно, важными для программы) данными, хранится по этому адресу. Таким образом, либо ваша программа сбой сразу из-за защиты памяти, либо вы меняете некоторые данные, принадлежащие программе. Последствия последнего могут различаться - возможно, ничего не происходит, может быть, вы не замечаете, может быть, вы повредите важные данные, а программа распадается - классическое поведение undefined.
Ответ 3
'p' указывает на неизвестное местоположение, а не на "не выделенную" память.
Отличие состоит в том, что, поскольку он undefined, он может указывать на выделенную память, даже если эта память не предназначена для доступа к этой функции.
Ответ 4
#include <stdio.h>
#include <stdlib.h>
int main(char** argv) {
// THIS POINTER IS NOT DECLARED (SO IT 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);
}
Ответ 5
int * p = 23;
Это совсем другое. Здесь вы объявляете указатель и назначаете ему значение 23. Значение теперь указывает на ячейку памяти 23, которая может содержать или не содержать читаемые данные.
Но просто присваивая произвольное значение указателю без разыменования, он совершенно безопасен.
Ответ 6
int * p;
initwardly указанный выше указатель содержит некоторое значение мусора (недопустимое значение адреса или не выделенный адрес).
* p = 23;
то вы пытаетесь поместить некоторое значение (23) в недопустимую память, приведет к поведению undefined.
Ответ 7
Кроме того, что пример не выделяет память для значения 23, он также не будет компилироваться в первую очередь, потому что у вас есть два символа в вашей символьной константе (которая должна быть строкой), Например, замените '% d' на "% d" в printf-statement.