C++ 以下程序在c++;? #包括 使用名称空间std; 无效测试(int*s){ s++; *s=3; } int main(){ int s=0; 测试(s&s); cout

C++ 以下程序在c++;? #包括 使用名称空间std; 无效测试(int*s){ s++; *s=3; } int main(){ int s=0; 测试(s&s); cout,c++,pointers,C++,Pointers,未定义的行为是未定义的。当像在main中一样调用时,test通过无效指针写入,因此任何事情都可能发生。您的程序具有未定义的行为 线路 #include<iostream> using namespace std; void test(int *s){ s++; *s=3; } int main(){ int s=0; test(&s); cout<<s; return 0; } 递增指针,而不是指针指向的对象的值 然后排队 s++;

未定义的行为是未定义的。当像在
main
中一样调用时,
test
通过无效指针写入,因此任何事情都可能发生。

您的程序具有未定义的行为

线路

#include<iostream>
using namespace std; 
void test(int *s){
  s++;
  *s=3;
}
int main(){
  int s=0;
  test(&s);
  cout<<s;
  return 0;
}
递增指针,而不是指针指向的对象的值

然后排队

s++;

修改了指针指向的新位置处的值。这是访问不应该访问的内存。

您在测试函数参数中传递了&s,因此*s是实际值,但当您增加s时,指针指向未定义的位置,因此输出可以是任何内容。删除行s++后,您将et 3作为答案。

您的程序表现出未定义的行为,因为
s++
没有指向内存中的有效位置。不会编译,所以任何输出都是无效的。请参阅。@NeilButterworth它正在编译,输出是我在讨论中编写的。您的编译器真的编译了它而没有抱怨吗?
int main{
我很清楚,删除s++后,我会得到3作为输出。但我想问为什么我得到的是3'0'而不是1。试着理解这个问题。
*s=3;