考试中的练习要求将执行以下程序后内存获得的值写在纸上。问题是,在这个程序中,当 for 循环到达元素 3 时,我们正在访问未分配的内存。写入未分配内存的值是否实际存储或未定义行为,因此不写入它是正确的,因为我们不这样做知道实际发生了什么。遵循计划:
#include <stdio.h>
int main()
{
int k[5][7] = {0};
int *p, *z;
p = k[1];
*p = 12;
for (int i = 0; i < 4; i++){
z = p + 8;
*z = *p + 2;
p = z;
}
return 0;
}
运行程序,出现分段错误,但是在考试纠错中,教授仍然分配了未分配内存区域中写入的值。那么,将我们要写入未分配内存的值写在纸上是否正确?
那么将我们要写入未分配内存的值写在纸上是否正确?
由于程序执行了多种未定义的行为,C 语言规范没有为该问题的任何特定答案提供任何理由。
但这并不直接相关,因为是你的教授决定他们接受什么答案。他们可能会接受解释为什么行为未定义的答案,而不是给出所请求的内存布局,但他们更有可能希望您假设一些特定的行为并基于此给出答案。
我不太关心这样的问题,但如果我面对它,那么我可能会做上述所有事情:解释所涉及的未定义行为,然后描述一个特定的、合理的行为选择,以此为基础回答关于记忆结果的内容,然后给出该行为暗示的答案。