BUCKET *首先; } DATA_LIST; void * newsym(size_t Size){ BUCKET * p = malloc(大小+ sizeof * p); 返回p? p + 1:NULL; } void freesym(void * p){ 免费((BUCKET *)p - 1); } 无法保证newsym的结果对于任何 结构,除了struct BUCKET本身之外,大多数都是正确对齐的。 Serve Lau写道,06/07 / 07 17:38: 你们中的一些人可能知道桶技术。以一般方式在C中创建链接列表或 任何数据结构。我想知道是否有任何UB 涉及以下片段,特别是newsym / freesym函数和 当返回的指针用于两者之间时 typedef struct BUCKET { struct fs_BUCKET * Next; struct fs_BUCKET ** Prev; } BUCKET; typedef struct DATA_LIST { size_t Size; BUCKET * First; } DATA_LIST; void * newsym(size_t Size){ BUCKET * p = malloc(尺寸+ sizeof * p); 返回p? p + 1:NULL; } void freesym(void * p){ free((BUCKET *)p - 1); 如果传递空指针,则调用UB。尝试: if(p)free((BUCKET)p - 1); } 您提供的代码段中没有UB,但使用它的代码中可能有 UB。具体来说,不能保证p + 1是正确对齐除了BUCKET以外的任何东西。 我也假设真正的代码将初始化隐藏指针 在使用之前。 - Flash Gordon " Flash Gordon" < sp ** @ flash-gordon.me.ukwrote in message news:84 ************ @ news.flash-gordon.me.uk .. 。 > void * newsym(size_t Size){ BUCKET * p = malloc(Size + sizeof * p ); 返回p? p + 1:NULL; } void freesym(void * p){ free((BUCKET *)p - 1); 如果传递空指针,则调用UB。尝试: if(p)free((BUCKET)p - 1); >} 那么这将是UB吗? typedef struct { int x; } SomeStruct; SomeStruct * s = newsym(sizeof * s); if(s) s-> x = 10; freesym(s); Some of you may be aware of the "bucket technique" to create linked lists orany data structure in C in a general way. I was wondering if there''s any UBinvolved in the following snippet, especially newsym/freesym functions andwhen the returned pointer is used in betweentypedef struct BUCKET {struct fs_BUCKET *Next;struct fs_BUCKET **Prev;} BUCKET;typedef struct DATA_LIST {size_t Size;BUCKET *First;} DATA_LIST;void *newsym(size_t Size) {BUCKET *p = malloc(Size + sizeof *p);return p ? p + 1 : NULL;}void freesym(void *p) {free((BUCKET *)p - 1);} 解决方案 Serve Lau wrote:Some of you may be aware of the "bucket technique" to create linked listsor any data structure in C in a general way. I was wondering if there''sany UB involved in the following snippet, especially newsym/freesymfunctions and when the returned pointer is used in betweentypedef struct BUCKET { struct fs_BUCKET *Next; struct fs_BUCKET **Prev;} BUCKET;typedef struct DATA_LIST { size_t Size; BUCKET *First;} DATA_LIST;void *newsym(size_t Size) { BUCKET *p = malloc(Size + sizeof *p); return p ? p + 1 : NULL;}void freesym(void *p) { free((BUCKET *)p - 1);}There is no guarantee that the result of newsym is properly aligned for anystructure, and mostly any type, other than struct BUCKET itself.Serve Lau wrote, On 06/07/07 17:38:Some of you may be aware of the "bucket technique" to create linked lists orany data structure in C in a general way. I was wondering if there''s any UBinvolved in the following snippet, especially newsym/freesym functions andwhen the returned pointer is used in betweentypedef struct BUCKET { struct fs_BUCKET *Next; struct fs_BUCKET **Prev;} BUCKET;typedef struct DATA_LIST { size_t Size; BUCKET *First;} DATA_LIST;void *newsym(size_t Size) { BUCKET *p = malloc(Size + sizeof *p); return p ? p + 1 : NULL;}void freesym(void *p) { free((BUCKET *)p - 1);If passed a null pointer this invokes UB. Try:if (p) free((BUCKET)p - 1);}There is no UB directly in the snippet you provide, but there could beUB in the code using it. Specifically, there is no guarantee that p+1 iscorrectly aligned for anything other than a BUCKET.I''m also assuming the real code will initialise the "hidden" pointersbefore they are used.--Flash Gordon"Flash Gordon" <sp**@flash-gordon.me.ukwrote in messagenews:84************@news.flash-gordon.me.uk...>void *newsym(size_t Size) { BUCKET *p = malloc(Size + sizeof *p); return p ? p + 1 : NULL;}void freesym(void *p) { free((BUCKET *)p - 1);If passed a null pointer this invokes UB. Try: if (p) free((BUCKET)p - 1);>}so this will be UB then?typedef struct{int x;} SomeStruct;SomeStruct *s = newsym(sizeof *s);if (s)s->x = 10;freesym(s); 这篇关于指针投UB?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 1403页,肝出来的..
09-08 08:02