意外的C代码输出

时间:2012-03-10 17:05:58

标签: c pointers

这是我的代码:

#include <stdio.h>


int main(){

int x[] = {6,1,2,3,4,5};
int *p=0;
p =&x[0];


while(*p!='\0'){

    printf("%d",*p);
    p++;
}

return 0;


}

运行时输出为612345-448304448336

减号后面的数字是什么,为什么我的代码会给出这个?

3 个答案:

答案 0 :(得分:2)

条件*p != '\0',与*p != 0相同,永远不会满足,因为您的数组不包含值为0的元素,因此您会超出数组边界和进入未定义的行为

相反,您应该直接控制数组范围:

for (int const * p = x; p != x + sizeof(x)/sizeof(x[0]); ++p)  // or "p != x + 6"
{
    printf("%d", *p);
}

答案 1 :(得分:1)

您运行循环直到遇到\0,但您的数组从未\0终止。

int x[] = {6,1,2,3,4,5};

创建一个不\0终止的数组。您必须明确添加\0作为最后一个元素。

由于数组未\0终止,while()循环会一直运行,直到遇到随机\0为止。从技术上讲,这是未定义行为,因为您正在读取未分配给变量的内存内容。

建议的解决方案:

int x[] = {6,1,2,3,4,5,0};

while(*p != 0)

答案 2 :(得分:0)

C中的数组不是Null终止的。这就是你的循环超出声明数组末尾的原因。数字跟随5只是在该存储空间中发生的任何事情。如果在分配数组后没有空字符,则循环将继续运行,直到它成为SegFault。