C++ 指针传入的参数,在函数中也没有改变参数值,但是在函数输出后参数值改变了,是什么原因
时间: 2024-04-07 19:32:46 浏览: 17
这种情况通常是由于指针传入的参数指向的内存地址被错误地修改了导致的。虽然在函数中没有对参数进行修改,但是函数可能会访问指针所指向的内存,如果在访问时出现错误,就可能会修改指针所指向的内存,最终导致参数值的改变。
比如,如果在函数中使用了未初始化的指针,或者访问了已经被释放的内存,就可能会导致参数值的改变。另外,如果函数中使用了指针访问了数组或结构体中的元素,也可能会导致参数值的改变。
为了避免这种情况,可以在函数中使用指针时,先进行合法性检查,确保指针指向的内存是合法的,并且不要修改指针所指向的内存,如果需要修改,应该创建新的内存来保存修改后的值。
相关问题
C++中传入参数的实际参数会不会在函数执行后改变
在C++中,如果传入的参数是基本类型(int、float、char等),则函数内部对这个参数进行的改变不会影响到调用函数时所传入的实际参数的值。但是,如果传入的参数是指针类型或引用类型,则函数内部对指针或引用所指向的对象进行的改变会影响到调用函数时所传入的实际参数的值。
例如,假设我们有以下代码:
```c++
void func(int a, int &b, int *c) {
a = 10;
b = 20;
*c = 30;
}
int main() {
int x = 1;
int y = 2;
int z = 3;
func(x, y, &z);
cout << x << " " << y << " " << z << endl;
return 0;
}
```
在这个例子中,我们定义了一个函数`func`,该函数有一个基本类型参数`a`、一个引用类型参数`b`和一个指针类型参数`c`。在函数内部,我们改变了这三个参数的值。在`main`函数中,我们定义了三个整型变量`x`、`y`和`z`,并将它们分别初始化为1、2和3。然后,我们调用`func`函数,并将`x`和`y`的值作为实参传递给了`func`函数的形参`a`和`b`,同时将`z`的地址作为实参传递给了`func`函数的形参`c`。最后,我们输出`x`、`y`和`z`的值。
运行上述代码后,输出结果为`1 20 30`。可以看到,在调用`func`函数后,`y`和`z`的值发生了改变,而`x`的值没有发生改变。这是因为在`func`函数中,对于参数`a`的改变只在函数内部生效,不会影响到`main`函数中的变量`x`;而对于参数`b`和`c`的改变,则会影响到`main`函数中的变量`y`和`z`,因为它们都是通过引用或指针传递的。
c++定义全局变量a ,将a作为参数传入函数,改变a的值
这是一个示例代码:
```c
#include <stdio.h>
int a = 10; // 定义全局变量a
void changeValue(int *ptr) { // 定义函数,参数为指向整型变量的指针
*ptr = 20; // 改变指针所指向的变量的值
}
int main() {
printf("a = %d\n", a); // 输出全局变量a的值,输出结果为 a = 10
changeValue(&a); // 将全局变量a的地址作为参数传入函数
printf("a = %d\n", a); // 再次输出全局变量a的值,输出结果为 a = 20
return 0;
}
```
在这个示例代码中,全局变量a被定义为整型变量,并且被初始化为10。然后,我们定义了一个函数changeValue,它接受一个指向整型变量的指针作为参数。在函数中,我们通过解引用指针来改变指针所指向的变量的值。在main函数中,我们首先输出全局变量a的值,然后将a的地址作为参数传入changeValue函数中,改变了a的值。最后,我们再次输出全局变量a的值,可以看到它已经被改变为20。