此C代码的输出说明

时间:2015-09-11 18:26:32

标签: c arrays

这是我的代码:

#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;
}

我需要输出的解释。

我被问到的原始问题以及预期的多项选择答案是:

code

4 个答案:

答案 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;直到执行大括号之间的代码之后才会递增。