在昨天的面试中,我被问到了这个问题。(当时我被这么多突如其来的问题给了很大压力)。
int *p;
*p=23;
printf("%d",*p);
这段代码有什么问题吗?
我向他解释说,您正在尝试为未分配内存的指针赋值。
但他反应的方式,好像我错了。虽然我得到了这份工作,但在那之后,他说莫希特再考虑一下这个问题。我不知道他想说什么。请让我知道我的回答中有什么问题吗?
编辑我在工作表上添加了代码;-
int *p;
p=malloc(sizeof(int));
*p=23;
printf("%d",*p);
这一定是完美的code...Am I对吧..
EDIT2
int *p;
*p=23;
OR
int *p=23;
我认为两者都有问题。因为有人在说这篇文章的标题。
发布于 2010-03-29 21:24:43
“尝试为未分配内存的指针赋值”
我想你只是说错了一点。你不是想给指针赋值,你是想给指针的被引用赋值。
由于指针未初始化,因此,正如您所说,这是未定义的行为。指针没有指向任何东西(至少不是有效的-正如其他答案指出的那样,p
的存储位可能恰好包含某个内存位置的地址的值,并且您的代码可能会覆盖该值。这个标准允许UB发生任何事情,但如果你知道一些关于你的实现的事情,你通常可以做出一个精明的猜测)。
因此,在面试官的脑海中,你可能有正确的想法,但在你的脑海中准确地记住这一点是有价值的,在你的演讲中,手指和月亮之间的区别是什么,以及你说的是哪一个。
发布于 2010-03-29 21:25:46
p
未初始化-它存储了一些地址。取消引用它是未定义的行为。
存储在p
中的地址可以映射到进程的地址空间,也可以不映射。如果它被映射,一些不相关(但对程序可能很重要)的数据将存储在该地址。因此,要么你的程序因为内存保护而立即崩溃,要么你改变了属于该程序的一些数据。后者的后果可能会有所不同--也许什么都没发生,也许你没有注意到,也许你破坏了重要的数据,程序崩溃了--典型的未定义行为。
发布于 2010-03-29 21:32:31
“p”指向未知位置,而不是指向“未分配”的内存。
不同之处在于,因为它是未定义的,所以它可以指向一个分配的内存,即使这个内存不打算被这个函数访问。
https://stackoverflow.com/questions/2538152
复制相似问题