This program是一ç§ä¸Žæ—§çš„å•é“¾è¡¨ç›¸åŒçš„方法。我没有创建å•ä¸ªç»“构并ä¿æŒä¸Žç»“æž„æˆå‘˜ç›¸åŒç±»åž‹çš„下一个节点的指针,而是使用了三ç§ä¸åŒçš„结构,æ¯ä¸ªç»“æž„ä¸éƒ½æœ‰ä¸€ä¸ªæ™®é€šçš„long nextaddress
æˆå‘˜æ¥æŒ‡å‘下一个的地å€èŠ‚ç‚¹ï¼Œå› ä¸ºæŒ‡é’ˆä¹Ÿæ˜¯è¿™æ ·åšçš„。
æ¯ä¸ªèŠ‚点还有一个int flag
æˆå‘˜ä½œä¸ºç»“构的第一个项目,data
部分由于其å¯å˜é•¿åº¦è€Œä½äºŽç»“构的末尾。
这三ç§ç»“构是内置类型的基本扩展,long
,double
å’Œchar
。在访问结构时,我首先将节点的地å€è½¬æ¢ä¸ºint *
,这使我å¯ä»¥è®¿é—®flag
ï¼Œè€Œæ— éœ€å°†åœ°å€å®Œå…¨ç±»åž‹åŒ–为三者ä¸çš„确定结构。
然åŽåˆ†æžflag
,完æˆäº†å„ç§æ“作。
所以这是我的问题。它å¯ä»¥ç§°ä¸ºæœ‰æ•ˆçš„链表å—?而且,它甚至是一个有效的数æ®ç»“æž„å—?
ç”案 0 :(得分:2)
您的代ç å˜åœ¨è®¸å¤šé—®é¢˜ï¼Œä½†ä»…涉åŠæ‚¨å¯¹ç»“构的具体问题
Standard C授予您解决方案的作用
 Â6.7.2.1结构和è”åˆè¯´æ˜Žç¬¦
   Â第15ç«
   Â在结构对象内,éžä½å—段æˆå‘˜å’Œä½åŸŸä¸çš„å•ä½   驻留的地å€æŒ‰å£°æ˜Žçš„顺åºå¢žåŠ 。 指å‘a的指针   结构对象,适当转æ¢ï¼ŒæŒ‡å‘å…¶åˆå§‹æˆå‘˜ï¼ˆæˆ–者如果该æˆå‘˜æ˜¯a   ä½å—段,然åŽåˆ°å®ƒæ‰€åœ¨çš„å•ä½ï¼‰ï¼Œå之亦然。å¯èƒ½æœ‰æœªå‘½åçš„   在结构对象ä¸å¡«å……,但ä¸åœ¨å…¶å¼€å¤´ã€‚
强调我的
您应该在其他结构ä¸ä½¿ç”¨SELECT * FROM [dbo].[MyTable] as P
WHERE P.Mode = CASE WHEN @includeMode1 = 1 THEN 1 ELSE 0 END OR
P.Mode = CASE WHEN @includeMode2 = 2 THEN 2 ELSE 0 END OR
P.Mode = CASE WHEN @includeMode3 = 3 THEN 3 ELSE 0 END
:这将授予尊é‡ï¼†ï¼ƒ34;åˆå§‹æˆå‘˜ï¼†ï¼ƒ34;的规则。
gen_struct
æ£å¦‚ä½ æ‰€çœ‹åˆ°çš„ï¼Œæˆ‘ä¹Ÿæ”¹å˜äº†struct gen_type {
int flag;
void *nextaddress;
};
struct node_type_int {
struct gen_type header;
long data;
};
struct node_type_real {
struct gen_type header;
double data;
};
struct node_type_char {
struct gen_type header;
char data;
};
的类型:æ„æ€æ˜¯æŒ‡é’ˆï¼Œæ‰€ä»¥ä½¿ç”¨æŒ‡é’ˆã€‚
æ—注:do-i-cast-the-result-of-malloc
ç”案 1 :(得分:1)
åªè¦æ‚¨æœ‰åŠžæ³•ç¡®å®šæ¯ä¸ªèŠ‚点包å«å“ªç§ç±»åž‹ï¼Œä¾‹å¦‚flag
å˜é‡ï¼Œå°±å¯ä»¥è¿™æ ·åšã€‚
æ— è®ºæ‚¨ä½¿ç”¨å“ªç§ç»“构类型,您都å¯ä»¥å‡è®¾flag
å’Œnextaddress
å°†ä½äºŽç›¸åŒçš„结构å移é‡ä¸Šï¼Œè¿™ä¼¼ä¹Žæ˜¯åˆç†çš„ã€‚è™½ç„¶ä¸¥æ ¼æ¥è¯´Cè¯è¨€å¹¶ä¸èƒ½ä¿è¯è¿™ä¸€ç‚¹ï¼Œä½†æˆ‘相信它å¯ä»¥åœ¨ä»»ä½•ç³»ç»Ÿä¸Šå®žé™…è¿è¡Œã€‚
但是,您ä¸èƒ½è®¤ä¸ºdata
ä½äºŽ(uint8_t*)&my_struct + sizeof(int) + sizeof(long)
。由于ä¸åŒçš„对é½è¦æ±‚,æ¤å移é‡å¯èƒ½å› 结构而异。
更严é‡çš„问题是指针别å。您ä¸èƒ½ä½¿ç”¨æŒ‡é’ˆstruct* x
并将其转æ¢ä¸ºå¦ä¸€ç§æŒ‡é’ˆç±»åž‹struct* y
。它将编译,但这è¿å了Cä¸çš„类型规则并调用未定义的行为(除éžä¸¤ä¸ªç»“构具有完全相åŒçš„æˆå‘˜ï¼‰ã€‚使用积æžä¼˜åŒ–(如GCC)的符åˆæ ‡å‡†çš„编译器ä¸ä¼šæŒ‰é¢„期编译æ¤ç±»ä»£ç 。 (What is the strict aliasing rule?)
为了安全起è§å¹¶èŽ·å¾—更好的程åºè®¾è®¡ï¼Œæˆ‘建议您改为:
typedef struct node
{
long nextaddress;
type_t type; // some enum
void* data;
} node_t;
å…¶ä¸data
与节点分开分é…ã€‚ä½ å¾—åˆ°ä¸€ä¸ªé“¾å¼é“¾æŽ¥åˆ—表。
ç”案 2 :(得分:0)
尼斯。开箱å³ç”¨ï¼Œæˆ‘喜欢ä¸åŒçš„åšæ³•ï¼ä½†æ˜¯......
考虑到内å˜å¯¹é½å·®å¼‚,您觉得下é¢çš„代ç å¯èƒ½å˜åœ¨é—®é¢˜ï¼š
dataaddress = ((long)(&generic->nextaddress)) + sizeof(long);
这里å‡è®¾æ•°æ®æ˜¯è¿žç»å˜å‚¨çš„ï¼Œå› æ¤é€šè¿‡å°†sizeof longæ·»åŠ åˆ°ä¸‹ä¸€ä¸ªåœ°å€çš„地å€æ¥è®¡ç®—æ•°æ®çš„地å€ã€‚但这ä¸ä¸€å®šæ€»æ˜¯è¿™æ ·å—?
相å,我觉得在读å–æ ‡å¿—å€¼åŽæ›´å¥½åœ°å°†å…¶è½¬æ¢ä¸ºé€‚当的结构类型,然åŽè¯»å–æ•°æ®ã€‚
è€ƒè™‘åˆ°è¿™äº›æŒ‘æˆ˜ï¼Œè™½ç„¶ä½ èŠ‚çœäº†ä¸€äº›å†…å˜ä½†å¢žåŠ 了一些处ç†ã€‚å› æ¤ï¼Œè™½ç„¶å®ƒçœ‹èµ·æ¥åƒä¸€ä¸ªæœ‰æ•ˆçš„链表,但实现å¯ä»¥æ ¹æ®å†…å˜ä¸Žå¤„ç†çš„选择æ¥å†³å®šã€‚
ç”案 3 :(得分:0)
您的代ç 至少有两个弱点:
1。)long
和指针之间的转æ¢ã€‚åªæœ‰å½“整数类型å¯ä»¥ä¿æŒå¿…è¦çš„范围时,Cæ ‡å‡†æ‰å…许这ç§æƒ…况,而在具有32ä½long
æ•´æ•°å’Œ64ä½æŒ‡é’ˆçš„体系结构ä¸å¯èƒ½ä¸æ˜¯è¿™ç§æƒ…况。
我在C11æ ‡å‡†ä¸æ·»åŠ 了引文,第6.3.2.3节指针:
 Âæ•´æ•°å¯ä»¥è½¬æ¢ä¸ºä»»ä½•æŒ‡é’ˆç±»åž‹ã€‚除éžäº‹å…ˆæŒ‡æ˜Žï¼Œå¦åˆ™   结果是实现定义的,å¯èƒ½æ²¡æœ‰æ£ç¡®å¯¹é½ï¼Œå¯èƒ½ä¸æŒ‡å‘   引用类型的实体,å¯èƒ½æ˜¯é™·é˜±è¡¨ç¤º.67)
   Â任何指针类型都å¯ä»¥è½¬æ¢ä¸ºæ•´æ•°ç±»åž‹ã€‚除éžäº‹å…ˆæŒ‡æ˜Žï¼Œå¦åˆ™ Â Â ç»“æžœæ˜¯å®žçŽ°å®šä¹‰çš„ã€‚å¦‚æžœç»“æžœæ— æ³•ä»¥æ•´æ•°ç±»åž‹è¡¨ç¤ºï¼Œ   行为未定义。结果ä¸å¿…在任何整数的值范围内   类型。
   Â67)用于将指å‘整数或整数的指针转æ¢ä¸ºæŒ‡é’ˆçš„æ˜ å°„å‡½æ•°   与执行环境的寻å€ç»“构一致
2.)实现å‡è®¾ä¸¤ä¸ªä¸åŒç»“æž„ä¸çš„å—段(其ä¸å‰é¢çš„å—段的类型匹é…)å˜å‚¨åœ¨ç»“构内的相åŒä½ç½®ï¼ˆå移)。虽然大多数实现都是如æ¤ï¼Œä½†åªæœ‰å½“这两个结构是è”åˆçš„ä¸€éƒ¨åˆ†æ—¶ï¼Œæ ‡å‡†æ‰èƒ½ä¿è¯è¿™ä¸€ç‚¹ã€‚
第6.5.2.3节结构和工会æˆå‘˜ï¼š
 Â为了简化工会的使用,我们æ出了一项特殊ä¿è¯ï¼šå¦‚æžœå·¥ä¼šåŒ…å« Â Â å‡ ä¸ªç»“æž„å…±äº«ä¸€ä¸ªå…±åŒçš„åˆå§‹åºåˆ—(è§ä¸‹æ–‡ï¼‰ï¼Œå¦‚果是è”盟   对象当å‰åŒ…å«è¿™äº›ç»“æž„ä¸çš„一个,å…许检查公共结构   其ä¸ä»»ä½•ä¸€ä¸ªçš„åˆå§‹éƒ¨åˆ†éƒ½æ˜¯å®Œæ•´ç±»åž‹çš„è”盟的声明   是å¯è§çš„。如果相应的æˆå‘˜ï¼ŒTwo结构共享共åŒçš„åˆå§‹åºåˆ—   对于一个或多个åºåˆ—具有兼容类型(并且对于ä½å—段,具有相åŒçš„宽度)   åˆå§‹æˆå‘˜ã€‚