我们可以通过另一个包含我们希望指针指向的其他变量地址的变量将地址分配给指针吗?
Can we assign address to a pointer by another variable containing address of some other variable we want Pointer to point to?
我试图通过另一个变量手动给出地址,而不是使用 &
。
#include <stdio.h>
int main()
{
int ab = 99;
int *p;
int f = &ab;
p = f;
printf("%d\n%d\n%d\n%d\n", &ab, p, f, p); // prints same address
printf("%d\n", *p); // By adding this line, gives SEGFAULT
}
./a.out
给出:
284008584
284008584
284008584
284008584
Segmentation fault (core dumped)
检查int
的大小和int *
的大小是否相同,这样整型变量就可以保存地址而不会丢失任何数据。使用以下代码检查:
printf("%lu, %lu \n", sizeof(int*), sizeof(int));
如果两者不一样,就会面临错误。
我会建议采用变量类型uintptr_t
,它可以容纳指针的地址。
您正在尝试将指针值分配给 int
。如果指针大于系统上的 int
,如果您在 64 位 OS 上是 运行,则很可能是 int
,那么您最终会在转换中丢失数据。当您随后转换回来时,您最终会得到一个无效指针,并且尝试取消引用该指针会导致崩溃。
您还通过使用错误的格式说明符打印指针来调用未定义的行为。您应该使用 %p
,并且您应该将指针转换为 void *
(需要转换为 void *
的少数情况之一)。如果这样做,转换中的数据丢失将变得很明显。
- 请将编译器的警告级别提高到最大,对于 GCC 是
-Wall -Wextra
,如果您也喜欢 -pedantic
。因为:
- 您的行
int f = &ab;
有一个错误。 RHS 上的表达式是 int
的地址,但 LHS 上的变量是 int
.
在您的系统上,整数和指针的大小可能不同,这就是取消引用从整数段错误设置的指针的原因。
除了以上关于指针和整数的不同大小的所有正确答案外,
如果您修改打印地址的行以使用正确的格式修饰符,您将看到输出地址不同,这是由于从指针转换到 int
:
期间丢失
printf("%p\n%x\n%p\n",&ab,p,f); // prints same address
示例:
0x7ffc8b716ea8
8b716ea8
0x8b716ea8
我试图通过另一个变量手动给出地址,而不是使用 &
。
#include <stdio.h>
int main()
{
int ab = 99;
int *p;
int f = &ab;
p = f;
printf("%d\n%d\n%d\n%d\n", &ab, p, f, p); // prints same address
printf("%d\n", *p); // By adding this line, gives SEGFAULT
}
./a.out
给出:
284008584
284008584
284008584
284008584
Segmentation fault (core dumped)
检查int
的大小和int *
的大小是否相同,这样整型变量就可以保存地址而不会丢失任何数据。使用以下代码检查:
printf("%lu, %lu \n", sizeof(int*), sizeof(int));
如果两者不一样,就会面临错误。
我会建议采用变量类型uintptr_t
,它可以容纳指针的地址。
您正在尝试将指针值分配给 int
。如果指针大于系统上的 int
,如果您在 64 位 OS 上是 运行,则很可能是 int
,那么您最终会在转换中丢失数据。当您随后转换回来时,您最终会得到一个无效指针,并且尝试取消引用该指针会导致崩溃。
您还通过使用错误的格式说明符打印指针来调用未定义的行为。您应该使用 %p
,并且您应该将指针转换为 void *
(需要转换为 void *
的少数情况之一)。如果这样做,转换中的数据丢失将变得很明显。
- 请将编译器的警告级别提高到最大,对于 GCC 是
-Wall -Wextra
,如果您也喜欢-pedantic
。因为: - 您的行
int f = &ab;
有一个错误。 RHS 上的表达式是int
的地址,但 LHS 上的变量是int
.
在您的系统上,整数和指针的大小可能不同,这就是取消引用从整数段错误设置的指针的原因。
除了以上关于指针和整数的不同大小的所有正确答案外,
如果您修改打印地址的行以使用正确的格式修饰符,您将看到输出地址不同,这是由于从指针转换到 int
:
printf("%p\n%x\n%p\n",&ab,p,f); // prints same address
示例:
0x7ffc8b716ea8
8b716ea8
0x8b716ea8