什么是int*p的问题;*P = 23;

Moh*_*ain 15 c pointers

昨天在我的采访中我被问到这个问题.(当时我被这么多突然的问题压得很厉害).

int *p;
*p=23;
printf("%d",*p);
Run Code Online (Sandbox Code Playgroud)

这段代码有问题吗?

我向他解释说你正在尝试为没有分配内存的指针赋值.

但他的反应方式,就像我错了.虽然我得到了这份工作,但在那之后他说Mohit再次考虑这个问题.我不知道他想说什么.请让我知道我的答案有什么问题吗?

编辑 我在表格上添加了代码; -

int *p;
p=malloc(sizeof(int));
*p=23;
printf("%d",*p);      
Run Code Online (Sandbox Code Playgroud)

这一定是完美的代码...我是对的..

EDIT2

int *p;
*p=23;
 OR
int *p=23;
Run Code Online (Sandbox Code Playgroud)

我认为两者都有问题.因为有些正在讲述帖子的标题.

Ste*_*sop 28

"尝试为未分配内存的指针赋值"

我想你只是误解了一下.您不是要尝试为指针赋值,而是尝试为指针的referand赋值.

由于指针未初始化,正如您所说,这是未定义的行为.指针不引用任何东西(至少不是有效的 - 正如其他答案所指出的那样,存储的位p可能恰好包含一个值,这是某个内存位置的地址,而你的代码可能会覆盖它.标准允许任何事情发生在UB,但了解你的实现,你通常可以采取精明的猜测).

因此,在面试官的脑海中,你可能有正确的想法,但是在你的思想中和你的演讲中直截了当地指出手指和月亮之间的差异以及你正在谈论的是哪一个是很有价值的.

  • 不,你也不是"为未初始化的内存分配值".如果我给你一个信封要传递,并且地址(指针值)被弄脏(未初始化),那么你就无法交付它.你不是想把它交给一个污迹斑斑的房子*,但是,你试图找出一个污迹*信封*所指的房子.它不涉及任何房屋,所以你可以休息一下午(未定义的行为). (14认同)
  • 所以,例如,如果我写`char c; char*p =&c;*p ='X';`,然后我为未初始化的内存(变量`c`)赋值('X').没有错. (3认同)

sha*_*oth 14

p未初始化 - 它存储了一些地址.取消引用它是未定义的行为.

存储的地址p可以映射到进程的地址空间中,或者可以不映射.如果映射了一些不相关的(但对程序可能很重要)数据存储在该地址.因此,由于内存保护,您的程序会立即崩溃,或者您更改属于该程序的某些数据.后者的后果可能会有所不同 - 也许没有任何反应,也许你没有注意到,也许你破坏了重要数据并且程序分崩离析 - 经典的未定义行为.


Pon*_*oni 7

'p'指向未知位置,而不指向"未分配"内存.

不同之处在于,由于它未定义,它可能指向已分配的内存,即使此内存不打算由此函数访问.