有没有办法将结构取消引用为 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);