在不分配内存的情况下为指针赋值(C)?

Assigning value to pointer without allocating memory (C)?

当我尝试以下代码时:

int *no_alloc_i;
*no_alloc_i = 3;
printf("%d\n", *no_alloc_i);

正如预期的那样,我的代码崩溃了。我相信那是因为我没有为 no_alloc_i 动态分配内存(如果我错了请纠正我),因为这样做会使主函数 return 0 并且代码按预期工作:

int *alloc_i = (int*)malloc(sizeof(int));
*alloc_i = 3;
printf("%d\n", *alloc_i);

后来试过给alloc_i分配内存,没有给no_alloc_i分配内存,然后给no_alloc_i赋值:

int *alloc_i = (int*)malloc(sizeof(int));
int *no_alloc_i;
*no_alloc_i = 3;
printf("%d\n", *no_alloc_i);

问题是我没有分配内存的指针 no_alloc_i 能够保存一个值。我不明白将内存分配给另一个变量会如何影响第一个变量的行为。提前致谢!

未定义的行为。它不能(也不应该尝试)被预测和依赖*。问题是,你只是没有为你的指针分配任何值,所以它是未初始化的,即持有一个半随机的不可预测的值。如果该值恰好是可写内存区域内的地址,则使用内存中的该位置将“成功”但会破坏其他内容,因为它不是 您的 内存。如果它是一个没有分配可写内存的地址,您将在尝试访问那里的内存时崩溃。

重要的是要认识到并非每个错误的行为或操作都会立即导致抛出异常。例如,它也可能只是导致数据的轻微损坏或其他问题,这些问题可能会或可能不会在以后造成更大的麻烦。


可以这样想:

您刚刚在随机找到的那张纸上写下了您的购物清单。无论如何,无法确定那张纸实际上是你笔记本中的下一张空白页,还是昨天的报纸、你今天演讲的笔记、你室友珍稀的歌德《维特》作者签名的副本,或者顺便说一句,它根本不是纸,而是你沉睡的猫的肚子。结果可能大相径庭——从一切都按预期工作到你被一只相当愤怒的猫科动物严重抓伤,你的行为的影响甚至可能会随着时间的延迟而显现出来,比如当你的室友 returns 从他的空手道训练并意识到你公然破坏了他最宝贵的家族遗产。试图合理化这一点并分析在什么条件下你可以逃脱它就像认为这里的问题是笔的错误选择,不适合你的猫的腹部柔软的性质而不施加足够的力量来唤醒她,而不是意识到如果您一开始就坚持使用记事本,那么 none 就会发生这种情况。


*:当然,从技术上理解会发生什么以及为什么会发生,这是很有教育意义的。一旦您足够深入地了解它的底层细节,您 就可以 大概预测会发生什么。但是,如果您发现某个场景似乎“可靠地”工作,尽管它是未定义的行为(即使您检查了生成的机器代码并且可以静态地肯定它会在该二进制文件中工作),依赖它仍然是一个坏主意在这一发现上,因为未定义行为的一种表现形式也可能是它适用于特定平台或仅适用于特定编译器。本质上,编译器必须在他们定义的每个场景中严格遵循规范,但可以做任何它想做的事情(或者在编写代码时容易做的任何事情,例如不关心“不可能”中发生的事情情况),以防涉及“未定义行为”。