我有一个存储5char *个指针的 struct

struct x {

       char *arr[5];
};

我使用malloc()为 struct 分配内存

struct x *str = malloc(sizeof(struct x));

然而,当我试图用一个值(即只读字符串文字)初始化arr时,它会给我一个错误

error: expected identifier before ‘(’ token
   13 |     (*str).(*(arr+0)) = "hello";
                   ^

这是我的初始化

(*str).(*(arr+0)) = "hello";

我知道我可以这样做

str->arr[0] = "hello"

但我想了解字符串数组是如何工作的,所以我使用了指针,首先将str->解引用并将其更改为(*str).

此外,由于arr[0]在初始化str->arr[0] = "hello"中工作,并且我知道arr[0]相当于*(arr+i),其中i是一个数组单元,我认为这在 (*str).(*(arr+0)) = "hello";中可以工作,但实际上不行.

为什么会这样?字符串数组在幕后是如何工作的?

推荐答案

该 struct 具有数据成员arr.

struct x {

       char *arr[5];
};

因此,您必须使用运算符.->写入访问数据成员,例如

*( (*str).arr + 0) = "hello";

这与

*(*str).arr = "hello";

*str->arr = "hello";

str->arr[0] = "hello";

That is member access operat或s are defined like

postfix-expression . identifier 
postfix-expression -> identifier

当您try 使用非标识符的表达式时.

使用您的方法访问数组的ant元素,您可以编写

*( (*str).arr + i) = "hello";

*( str->arr + i) = "hello";

That is at first you need to get the array designat或 like

( *str ).arr

str->arr

然后可以对获得的数组使用指针算法.

C++相关问答推荐

strftime函数中%s的历史意义是什么?为什么没有记录?

有效地计算由一组点构成的等边三角形和等腰三角形的数量

为什么这个C程序代码会产生以下结果?

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

为什么GCC可以调用未定义的函数?

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

变量>;-1如何在C中准确求值?

使用双指针动态分配和初始化2D数组

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

在Linux上使用vscode和lldb调试用Makefile编译的c代码

C堆栈(使用动态数组)realloc内存泄漏问题

使用Open62541向OPCUA服务器发送读请求时内存泄漏

为什么我无法访问C语言中的文件

即使我在C++中空闲,也肯定会丢失内存

unions 的原子成员是个好主意吗?

RISC-V GCC编译器错误编译ASM代码

即使客户端不发送数据,也会发生UNIX套接字读取

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

如何向 execl 创建的后台程序提供输入?