在 c-segmentation 错误中使用指针指向变量
Pointing to a variable using pointers in c-segmentation fault
我希望指针 p 指向 (var-1) 的值。请提出解决此错误的方法。
int var = 10;
int *p;
*p =var-1;
printf("%d",*p);
你试图让 p 指向一个没有分配内存的整数值,你不能这样做。 p 需要指向类型为 int
的现有变量,其值为 var - 1。您可以这样做,使用临时变量为 var - 1 分配 space。
int var = 10;
int temp = var - 1;
int* p = &temp;
printf("%d",*p);
或者您可以直接编辑 var。
int var = 10;
var -= 1;
int* p = &var;
printf("%d",*p);
要指向表达式 (var-1)
的值,您需要一个对象来存储该值。
所以唯一的方法是提供变量 var
本身不应该改变的是以下
int var = 10;
int var2 = var-1;
int *p = &var2;
printf("%d",*p);
或者您可以动态分配一个 int 类型的对象,表达式的结果将存储在其中
int var = 10;
int *p = malloc( sizeof( int ) );
*p = var-1;
printf("%d",*p);
//...
free( p );
根据 C 标准(6.5.3.2 地址和间接运算符)
1 The operand of the unary & operator shall be either a function
designator, the result of a [] or unary * operator, or an lvalue
that designates an object that is not a bit-field and is not
declared with the register storage-class specifier.
和
4 The unary * operator denotes indirection. If the operand points to a
function, the result is a function designator; if it points to an
object, the result is an lvalue designating the object. If the operand
has type ‘‘pointer to type’’, the result has type ‘‘type’’. If an
invalid value has been assigned to the pointer, the behavior of the
unary * operator is undefined.
在原始代码片段中,您遇到了分段错误,因为指针 p
未指向有效对象并且具有不确定的值,因为它未被初始化。
int *p;
*p =var-1;
你不能指向一个值,你只能指向一个包含值的对象。请记住,指针是一个地址1,只有对象可以有地址。
您可以执行以下两项操作之一:
- 您可以将
p
指向 var
,然后从 var
中减去 1
:int var = 10;
int *p = &var;
*p = *p - 1; // same as writing var = var - 1
printf( "%d\n", *p );
这会更改存储在 var
中的值。
- 如果你不想改变
var
中存储的值,那么你需要创建一个新的对象来存储var - 1
的值并设置p
指向这个新对象:int var = 10;
int var2 = var - 1;
int *p = var2;
printf( "%d\n", *p );
- 无论是虚拟地址还是物理地址,是简单的整型值还是像 (page # : offset) 这样的元组等,都取决于实现。
我希望指针 p 指向 (var-1) 的值。请提出解决此错误的方法。
int var = 10;
int *p;
*p =var-1;
printf("%d",*p);
你试图让 p 指向一个没有分配内存的整数值,你不能这样做。 p 需要指向类型为 int
的现有变量,其值为 var - 1。您可以这样做,使用临时变量为 var - 1 分配 space。
int var = 10;
int temp = var - 1;
int* p = &temp;
printf("%d",*p);
或者您可以直接编辑 var。
int var = 10;
var -= 1;
int* p = &var;
printf("%d",*p);
要指向表达式 (var-1)
的值,您需要一个对象来存储该值。
所以唯一的方法是提供变量 var
本身不应该改变的是以下
int var = 10;
int var2 = var-1;
int *p = &var2;
printf("%d",*p);
或者您可以动态分配一个 int 类型的对象,表达式的结果将存储在其中
int var = 10;
int *p = malloc( sizeof( int ) );
*p = var-1;
printf("%d",*p);
//...
free( p );
根据 C 标准(6.5.3.2 地址和间接运算符)
1 The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.
和
4 The unary * operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object. If the operand has type ‘‘pointer to type’’, the result has type ‘‘type’’. If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined.
在原始代码片段中,您遇到了分段错误,因为指针 p
未指向有效对象并且具有不确定的值,因为它未被初始化。
int *p;
*p =var-1;
你不能指向一个值,你只能指向一个包含值的对象。请记住,指针是一个地址1,只有对象可以有地址。
您可以执行以下两项操作之一:
- 您可以将
p
指向var
,然后从var
中减去1
:
这会更改存储在int var = 10; int *p = &var; *p = *p - 1; // same as writing var = var - 1 printf( "%d\n", *p );
var
中的值。 - 如果你不想改变
var
中存储的值,那么你需要创建一个新的对象来存储var - 1
的值并设置p
指向这个新对象:int var = 10; int var2 = var - 1; int *p = var2; printf( "%d\n", *p );
- 无论是虚拟地址还是物理地址,是简单的整型值还是像 (page # : offset) 这样的元组等,都取决于实现。