这是我的代码:
#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
减号后面的数字是什么,为什么我的代码会给出这个?
答案 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。