为什么gcc和gdb之间的意见不同

why a difference of opinion between gcc and gdb

GCC 认为我有

sql_LV.c:543:35: error: request for member ‘str’ in something not a structure or union
        &(((**functions).String[i]).str)

GDB 的想法不同:

(gdb) print &(((**functions).String[0]).str)
 = (uChar (*)[1]) 0xf550514c
(gdb) print (((**functions).String[0]).str)
 = "N"

这是代码:

typedef struct {
    int32 cnt;      /* number of bytes that follow */
    uChar str[1];   /* cnt bytes */
} LStr, *LStrPtr, **LStrHandle;

typedef struct {
    int32 dimSize;
    LStrHandle String[1];
    } LStrArry;
typedef LStrArry **LStrArryHdl;

char IsFunction(LStrArryHdl functions, char* InStr, int32 InStrLen) {
    if (functions == NULL) return 0;
    for (int i = 0; i< (**functions).dimSize; i++) {
        if (strncmp(InStr,
                            &(((**functions).String[i]).str),
                            (InStrLen < ((**functions).String[i].cnt) ? InStrLen : ((**functions).String[i].cnt))
                            ) == 0) return 1; 
    }
    return 0;
}

所以有什么不一致?我已经包括了 typedefs。

要了解发生了什么,您只需要分解类型,因此:

&(((**functions).String[i]).str)

String[i]的类型是LStrHandle,也就是**LStr。所以你不能应用 . 运算符。

如果您取消引用 String[i],那么您将得到一个 *Lstr,可以向其应用 ->,如:

&((*((**functions).String[i]))->str)

您在以下行中使用 .cnt 时也犯了同样的错误。

我也有点怀疑你在这一行中使用 &。由于 str 被定义为 uChar str[1];(假设 typedef unsigned char uChar),那么这一行的类型 &((*((**functions).String[i]))->str) 将是 unsigned char **,当我怀疑你真的想要 unsigned char *。您可能想要删除前导 &?