Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解释此C代码的输出_C_Arrays - Fatal编程技术网

解释此C代码的输出

解释此C代码的输出,c,arrays,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]); } re

这是我的密码:

#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;
}
#包括
#包括
int main()
{
无效检查(整数n,整数arr[]);
int arr[]={1,2,3,4};
int i;
检查(4,arr);
对于(i=0;i<4;i++){
printf(“%d\n”,arr[i]);
}
返回0;
}
无效检查(整数n,整数arr[]){
int i=0;
int*p=0;
while(i++
我需要对输出进行解释

我最初被问到的问题和预期的多项选择题答案是:

请发布您的实际代码,而不是您想要键入的代码。实际上,复制粘贴您的真实代码

因为你打错了

您可以在此处添加额外的{}:

while(i++ < n) {
    p = &arr[i];
    *p = 0;
}
while(i++
或者使用逗号而不是分号:

while(i++ < n)
    p = &arr[i],
*p = 0;
while(i++
所以每次都是零的赋值

编辑添加:是的,您添加了原始问题没有的额外{}。因此,在您的代码中,“*p=0”在while循环中每次执行一次,而原来的问题“*p=0”只执行一次,并对数组末尾的某个随机数据进行重击

(顺便说一下,原始问题的答案实际上是“这是未定义的行为;程序不一定打印任何内容。有效的行为包括打印1234、打印4242、崩溃和格式化硬盘。”)

检查()
中,
i
在比较后递增,但是在第一次陈述之前。所以数组的零(第一个)元素永远不会像其他元素一样设置为0<代码>arr
的1保持为1,2、3和4分别变为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++
和使用:

while (i < n) {
    p = &arr[i];
    *p = 0;
    i++;
}
while(i
第四: 您对此有何期待:

int*p=0


无论如何,您只是尝试访问一个不属于您的内存位置。

我不确定您在谈论什么选择,但是您的输出原因如下:

int i=0;
int *p=0
while(i++<n)
{
    p=&arr[i];
    *p=0;
}
inti=0;
int*p=0

虽然(i++不把图像放在可以使用文本的地方!把代码放在这里,而不是代码的图像。你是为了运行代码而转录代码的吗?如果是这样的话,那么就把它粘贴在这里。除了面向图像的抱怨之外,你可能把
while
语句弄错了。我已经添加了代码。@shrevardhan:是的,这可能是最常见的结果,而且问题的提出者可能期望得到答案。但根据C标准,程序有“未定义的行为”它可以做任何事情。因此,无论是谁设置了最初的多项选择题,都犯了一个错误。请注意,图像不是我的代码。这只是我得到的一个问题。我需要对输出进行解释,每当我run@BelalFathy输出应该是什么?很好。如果他按原样使用程序,那么结果应该是1,2,3,4.Cuz,*p实际上会重置数组已分配内存之外的内存位置值,即arr[4]=0-这可能会重置main()中的变量i函数,它没有任何效果。基本上,这是一个错误的代码,并且由于数组溢出,您可能无法在所有平台上获得一致的结果。OMG:D这是正确的。那么为什么要将while语句放在那里?或者它只是一个废话?@Janakiram根据体系结构和编译器的不同,它可能会阻塞返回地址并导致crash,或者如果您启用了编译器的安全“检测缓冲区溢出”选项,那么它可能会在运行时检测到错误并中止程序。真正聪明的编译器(例如clang)可能会在编译时检测到缓冲区溢出,并将整个程序优化为一次中止调用().第四点:
int*p=0;
使用空指针初始化指针
p
。这是非常干净的。
for (int i = 0; i < n; ++i)
{
    // stuff
}