#include <iostream>
using namespace std;
void fn(int* input_ptr) {
int *ptr2 = input_ptr;
cout << "pointer 2 is " << *ptr2 << endl;
}
int main() {
int *ptr1;
*ptr1 = 7;
fn(ptr1);
}
这个例子有效,因为我传递一个指向函数的指针,并将其分配给函数内部的临时指针,结果显示指针2也是7。 然而,
#include <iostream>
using namespace std;
int main() {
int *ptr1;
*ptr1 = 7;
int *ptr2;
*ptr2 = ptr1; // or I have also tried *ptr2 = *ptr1
cout << "pointer 2 is " << *ptr2 << endl;
}
同样的步骤在main函数中不起作用。我知道你可以使用没有星号的地址ptr2 = ptr1,它会起作用。
但是,在第一个例子中,我可以直接将指针作为函数参数分配给带有星号的新指针(或称为dereferecing?),但在第二个示例中,我不能在main函数中执行此操作。
有人可以帮忙解决这个问题吗?感谢你的时间。
答案 0 :(得分:6)
在这两个示例中,您将取消引用未初始化的指针,即未定义的行为。
对于指针赋值问题,您可以直接指定:
int *ptr2 = ptr2;
在第二个示例中,前提是您确保ptr1
点在有效位置。例如,
int x;
int *ptr1 = &x; /* ptr1 now points to the address of x */
*ptr1 = 7;
int *ptr2;
ptr1 = ptr2;
答案 1 :(得分:3)
在main
中,变量ptr1
未初始化为指向正确分配的内存块。
因此,程序的其余部分会产生未定义的行为。
答案 2 :(得分:1)
这里使用指针的方法存在一个主要问题。直接取消引用指针可能会导致usr和barak
建议的未定义行为您需要使用
为此处的指针分配内存int* ptr1 = new int[1];
此外,由于您是分配内存的人,因此需要在退出
之前进行清理delete[] ptr1;
如果您不想使用动态内存分配,可以将其初始化为
int a = 7;
int* ptr1 = &a;
这样你就不会解除引用迷路指针并导致未定义的行为。
关于
的输出 *ptr1 = ptr2; // or I have also tried *ptr1 = *ptr2
C ++或C中的值分配是从右到左。因此ptr2将不具有ptr1;
的值例如;
int a = 5;
int b = 6;
a=b;
会a = 6
。
相反
b = a;
会b = 5
。