0

当我遇到这个奇怪的事情时,我正在学习指针和指向数组的指针。

谁能解释为什么这有效?

char str[] = "This is a String";
int *p = str;
while(*p) std::cout<<*p++; 

并返回:

图片

但这会产生一个令人讨厌的错误:

int arr[] = {1,2,3,4,5,6,7,8,9};
int *p = arr;
while(*p) std::cout<<*p++<<" ";

像这样 :

图片

我知道这是未定义的行为,那么有什么办法可以解决这个问题吗?

4

1 回答 1

4
char str[] = "This is a String";
int *p = str;

这个程序格式不正确。在 C++char[N]中不会隐式转换为,仅转换为.int*char*


int arr[] = {1,2,3,4,5,6,7,8,9};
int *p = arr;
while(*p) std::cout<<*p++<<" ";

我知道这是未定义的行为

你明白为什么它是未定义的行为吗?问题是结束循环的条件是当你到达值为 0 的元素时。但是你没有在你的数组中放任何零,所以循环永远不会停止并且你访问数组的末尾。

有什么办法可以解决这个问题。

当然。只是不要访问超出数组的范围。

一个不错的选择是使用 range-for 循环:

for(int i : arr) {
    std::cout << i << ' ';
}
于 2021-08-23T22:35:24.723 回答