为什么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 *
。您可能想要删除前导 &
?
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 *
。您可能想要删除前导 &
?