有没有办法将结构取消引用为 C 中的指针?
Is there a way to deference a struct as a pointer in C?
纯实验
在我们开始之前,这纯粹是实验性的,我不关心未定义的行为。
使用 clang 13
.
我的代码
typedef struct {
char *chr;
int64_t len;
} string;
string str;
int main() {
str.chr = "ABCDE";
str.len = 6;
printf ("str.chr = %p\n", str.chr);
printf ("str = %p\n", str);
}
输出
str.chr = 0x5c0845c56e // same address
str = 0x5c0845c56e // same address
我想做类似 *str
的事情。这相当于 *(0x5c0845c56e)
。所以 str
基本上用作指向字符串的指针。
Ofc,编译器会在那个时候抛出错误
error: indirection requires pointer operand ('string' invalid)
printf ("*str = %c\n", *str);
^~~~
我试过将 str
转换为 void *
和 char *
,但这不起作用。
str 未声明为指针,因此您不能使用 *.
取消引用它
#include <stdio.h>
#include <stdint.h>
typedef struct {
char *chr;
int64_t len;
} string;
string str;
int main () {
int s = sizeof(char *);
str.chr = "ABCDE";
str.len = 6;
printf ("str.chr = %llu\n", &str.chr); //address of str.chr
printf ("char * = %llu\n", &str); //first 8 bytes of str structure
}
输出
@home:~$ ./a.out
str.chr = 94437003264064
char * = 94437003264064
I want to do something like *str
. This'd be equivalent to
*(0x5c0845c56e)
. So str
is basically used as a pointer to the
string.
但是 str
不是 指针。它是一个结构。要回答标题问题,不,在 C 中没有办法取消引用结构类型的值。
Ofc, the compiler throws an error at that
error: indirection requires pointer operand ('string' invalid)
printf ("*str = %c\n", *str);
^~~~
正如我所说,您不能取消引用结构。
I've tried casting str
to void *
and char *
but that doesn't
work.
当然不是。 C 没有定义结构和指针之间的任何转换。
我猜你一定是想用数组来类比,但它们的行为根本不相似。但是,如果您想要结构的 first 成员,则可以使用 &
运算符来获取结构的地址,将其转换为指向第一个成员类型的指针,并取消引用 that 以获得表示第一个成员的左值:
printf ("str = %c\n", *(*(char **)&str));
// here ---------------------^^^^^^^^^^^^^^
但由于这取决于了解结构类型的定义(以正确转换指针),因此与以标准方式访问第一个成员相比,它没有任何优势:
printf ("str = %c\n", *str.chr);
纯实验
在我们开始之前,这纯粹是实验性的,我不关心未定义的行为。
使用 clang 13
.
我的代码
typedef struct {
char *chr;
int64_t len;
} string;
string str;
int main() {
str.chr = "ABCDE";
str.len = 6;
printf ("str.chr = %p\n", str.chr);
printf ("str = %p\n", str);
}
输出
str.chr = 0x5c0845c56e // same address
str = 0x5c0845c56e // same address
我想做类似 *str
的事情。这相当于 *(0x5c0845c56e)
。所以 str
基本上用作指向字符串的指针。
Ofc,编译器会在那个时候抛出错误
error: indirection requires pointer operand ('string' invalid)
printf ("*str = %c\n", *str);
^~~~
我试过将 str
转换为 void *
和 char *
,但这不起作用。
str 未声明为指针,因此您不能使用 *.
取消引用它#include <stdio.h>
#include <stdint.h>
typedef struct {
char *chr;
int64_t len;
} string;
string str;
int main () {
int s = sizeof(char *);
str.chr = "ABCDE";
str.len = 6;
printf ("str.chr = %llu\n", &str.chr); //address of str.chr
printf ("char * = %llu\n", &str); //first 8 bytes of str structure
}
输出
@home:~$ ./a.out
str.chr = 94437003264064
char * = 94437003264064
I want to do something like
*str
. This'd be equivalent to*(0x5c0845c56e)
. Sostr
is basically used as a pointer to the string.
但是 str
不是 指针。它是一个结构。要回答标题问题,不,在 C 中没有办法取消引用结构类型的值。
Ofc, the compiler throws an error at that
error: indirection requires pointer operand ('string' invalid) printf ("*str = %c\n", *str); ^~~~
正如我所说,您不能取消引用结构。
I've tried casting
str
tovoid *
andchar *
but that doesn't work.
当然不是。 C 没有定义结构和指针之间的任何转换。
我猜你一定是想用数组来类比,但它们的行为根本不相似。但是,如果您想要结构的 first 成员,则可以使用 &
运算符来获取结构的地址,将其转换为指向第一个成员类型的指针,并取消引用 that 以获得表示第一个成员的左值:
printf ("str = %c\n", *(*(char **)&str));
// here ---------------------^^^^^^^^^^^^^^
但由于这取决于了解结构类型的定义(以正确转换指针),因此与以标准方式访问第一个成员相比,它没有任何优势:
printf ("str = %c\n", *str.chr);