这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
void check(int n, int arr[]);
int arr[] = {1, 2, 3, 4};
int i;
check(4, arr);
for (i = 0; i < 4; i++) {
printf("%d\n", arr[i]);
}
return 0;
}
void check(int n, int arr[]) {
int i = 0;
int *p = 0;
while (i++ < n)
p = &arr[i];
*p = 0;
}
我需要输出的解释。
我被问到的原始问题以及预期的多项选择答案是:
答案 0 :(得分:1)
请发布您的实际代码,而不是您打算输入的代码。实际上复制粘贴你的真实代码。
因为你输错了。
您可以在此处添加额外的{}
while(i++ < n) {
p = &arr[i];
*p = 0;
}
或者您使用的是逗号而不是分号:
while(i++ < n)
p = &arr[i],
*p = 0;
所以每次都会分配到零。
编辑添加:是的,你添加原始问题没有的额外{}。所以在你的代码中,每次循环while循环都会执行“* p = 0”,而原始问题“* p = 0”只执行一次,并且会破坏一些超出数组末尾的随机数据。 / p>
(顺便说一句,原始问题的答案实际上是“它是未定义的行为;程序不一定打印任何东西。有效行为包括打印1 2 3 4,打印42 42 42 42,崩溃和格式化你的硬盘。“)
答案 1 :(得分:0)
在check()
中,i
在比较后增加,但在第一个语句之前。因此,数组的零(第一)元素永远不会设置为0,就像其余元素一样。 arr
的1分为1分,2分,3分和1分。每个都变为0。
编辑: 自我讨论的版本以来,OP代码已经改变。现在这是一个全新的问题。
答案 2 :(得分:0)
你应该知道的一些事情。
第一: 如果你在main之后声明/定义它们,你应该声明你的函数。
第二: 声明一个数组时,数组从0到n而不是从1到n。 所以,如果你声明int arr = {1,2,3,4}那么你有arr [0],1,2,3而不是arr [1],2,3,4。
第三: 你应该避免像:
这样的代码while (i++ < n) {
p = &arr[i];
*p = 0;
}
并使用:
while (i < n) {
p = &arr[i];
*p = 0;
i++;
}
第四: 您对此的期望是什么:
int * p = 0;
无论如何,您只是尝试访问不属于您的内存位置。
答案 3 :(得分:0)
我不确定您正在谈论什么选择,但输出的原因在于:
int i=0;
int *p=0
while(i++<n)
{
p=&arr[i];
*p=0;
}
变量&#39;我&#39;从0开始,但在进入循环之前递增它,因此忽略数组的第一个索引。然后设置指向数组索引的指针&#39; i&#39;然后立即取消引用指针并将值设置为0;
因此,您传递的任何数组将始终保留其第一个值,而其他每个值都为零。
如果你想要包含数组的第一个索引,你可以做得更好:
for (int i = 0; i < n; ++i)
{
// stuff
}
有了这个,&#39;我&#39;直到执行大括号之间的代码之后才会递增。