你能通过对指针解引用返回一个整数吗?
Can you return an integer by dereferencing a pointer?
int f(int *x)
{
*x = 5;
return *x;
}
int main()
{
int * y = 0;
int z = f(y);
}
为什么这段代码会给我一个运行时错误?
为什么这段代码会给我一个运行时错误?
因为y
是NULL
指针,在f()
中被解引用。注意,解引用NULL
指针是未定义的行为。
可以通过对指针解引用返回整数吗?
是的,假设指针指向一个有效的int
。例如:
int main()
{
int y = 0;
int z = f(&y);
}
如果指针指向有效内存,则可以。在您的情况下,您正在解引用NULL (0x00
)指针,这是未定义的行为(aka UB)。例如,这个就可以很好地工作:
int f(int *x)
{
*x = 5;
return *x;
}
int main()
{
int value = 1986;
int *y = &value; // Point to something valid.
int z = f(y);
}
因为在int *y = 0;
之后,y
是一个不指向任何东西的指针(指向地址0
)。你的代码应该是这样的:
int * y = new int;
*y = 0;
int z = f(y);
// ...
delete y;
或
int y = 0;
int z = f(&y);
在解引用前检查指针,并始终指定错误行为:
int f(int *x)
{
if ( x )
{
// do something with x
}
else
{
// do something else in case null pointer
}
}
对空指针解引用会产生空指针异常,如您的情况。
您正在将指针y
设置为0
,使其成为NULL
指针:
int * y = 0;
,然后你试图执行间接在指针在f()
这里:
*x = 5;
^
和后面的行,这是未定义的行为。如果我们看一下c++标准草案8.3.2
References段落5说:
[…注意:特别地,空引用不能存在于定义良好的程序中,因为创建这样一个引用的唯一方法是将它绑定到通过空指针间接获得的"对象"上,这会导致未定义的行为。[…]
相关文章:
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 如何将一个数组值合并为一个整数c++
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 我可以将迭代器递增一个整数吗?
- 有没有办法生成一个包含平方的序列,这些平方加起来就是一个整数平方?
- 为什么将两个浮点数相加会得到一个整数C++?
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 给枚举一个整数,并在 C++ 中将其相关值作为字符串获取
- 按升序输出整数时,将最后一个整数放在新行上
- 编写一个程序,提示用户输入一个整数,然后输出数字的单个数字和数字的总和
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 给定一个整数,将其表示为平方和
- c++interpret_cast是一个整数
- 以最少的步骤将给定整数转换为另一个整数
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 我需要将字符串(例如 A5)转换为一个字符串 (A) 和一个整数 (5)
- 如何交替从文件中获取一行数据和一个整数?
- 如何让这个C++代码从用户那里读取五个整数而不是一个整数?