c-用指向第一个成员的指针调用free是否有效



可以对指向结构的第一个成员的指针调用free吗?我知道原则上指针指向的是正确的东西。。。

struct s {int x;};
//in main
struct s* test;
test = (struct s*) malloc(sizeof(*test));
int* test2;
test2 = &(test->x);
free(test2); //is this okay??

此外,如果int x被替换为结构,答案会改变吗?

更新:我为什么要写这样的代码

struct s {int x;};
struct sx1 {struct s test; int y;}; //extending struct s
struct sx2 {struct s test; int z;}; //another
// ** some functions to keep track of the number of references to each variable of type struct s 
int release(struct s* ptr){
  //if the number of references to *ptr is 0 call free on ptr
}
int main(){
    struct sx1* test1;
    struct sx2* test2;
    test1 = (sx1*) malloc(sizeof(*sx1));
    test2 = (sx2*) malloc(sizeof(*sx2));
    //code that changes the number of references to test1 and test2, calling functions defined in **
    release(test1);
    release(test2);
}

是的,这没问题。

6.7.2.1

  1. 在结构对象中,非位字段成员和位字段所在的单位resident的地址按声明的顺序增加指向经过适当转换的结构对象指向其初始成员(或者如果该成员是位字段,然后到它所在的单元),反之亦然可能有未命名的在结构对象中填充,但不在其开头

这意味着这是定义的:

struct s {int x;};
struct s* test;
test = (struct s*) malloc(sizeof(*test));
int* p = &(test->x);
free(p);

根据C11标准,第6.7.2.1章

[…]可能有未命名的在结构对象中填充,但不在其开头。

这意味着在结构的开头不能有任何填充。因此,第一个成员的地址将与结构变量的地址相同。

CCD_ 2需要先前由CCD_ 3或家族返回的指针。

在您的情况下,您传递的地址与malloc()返回的地址相同。所以,你可以走了。

相关内容

  • 没有找到相关文章

最新更新