将指针分配给使用malloc保留的块

将指针分配给使用malloc保留的块,c,malloc,C,Malloc,根据这一回答: 这里有一个基本问题,就是如何考虑结构分配。 当您malloc一个结构时,您malloc该结构的大小,您不需要malloc它将包含的数组,这些数组需要单独分配。为此,您的代码应该更像: myStruct *allocMyStruct(int num) { myStruct *p = malloc( sizeof( myStruct ) ); if( p != NULL ) { p->arr1 = malloc( sizeof( int

根据这一回答:


这里有一个基本问题,就是如何考虑结构分配。 当您malloc一个结构时,您malloc该结构的大小,您不需要malloc它将包含的数组,这些数组需要单独分配。为此,您的代码应该更像:

myStruct *allocMyStruct(int num)
{
    myStruct *p = malloc( sizeof( myStruct ) );

    if( p != NULL )
    {
        p->arr1 = malloc( sizeof( int ) * 10 ); // p->arr1 now points to an array of 10 elements
        p->arr2 = malloc( sizeof( int ) * 10 * num ); // p->arr2 now points to an array of 10 * num elements
    }
    return p;
}
请记住,当您释放此文件时,您还需要单独释放数组,因此如果您的指针myStruct是:


您可能会遇到内存对齐问题?在他的情况下,不,这段代码看起来fine@art:如果这很常见,我认为p+1与cast结合不会导致问题,这取决于编译此代码的平台?我的意思是:32位指针占用4个字节,而64位PTR需要8个字节。。。这就是我不确定的,不管怎样…p+1给了你一个指针,这个指针有足够好的对齐方式,在这种情况下可以处理myStruct。如果指向结构的指针比任何结构成员的对齐限制都要低,那么就很难和不可能提出对齐要求。所以在这种情况下,指针不可能与int对齐,除非int比int有更高的对齐要求,我很难相信这一点。可能有一些奇怪的架构会发生这种情况,但我不知道有。理论上可能吗?大概在实践中?“很好。”阿特:我一直在四处挖掘。p+1确实看起来不太可能造成麻烦,尽管没有真正的保证。p+1应该给出下一个指针,因此根据体系结构,它将移位4或8个字节。虽然没有保证,但是在99.999上…+IEEE 754舍入错误%的机器,这不会是一个问题。OP在对malloc的一次调用中分配了足够的内存。您可能想再看一看。OP正在尝试一种优化,所有内存都在一块中分配,而不是使用单独的分配。调整arr1/arr2指针以指向该内存。这是一件完全正确的事情,但你必须注意对齐。@nos:你到底在哪里看到对齐可能存在的问题?@alk在这种情况下,可能没有问题-但在一般情况下,你必须考虑一下。@JonathanMee:请问你指的是哪种不当行为?OP代码中只有一个分配,它的返回值被传递给free-这将非常好地工作。
p->arr1 = (int *)(p + 1);
myStruct *allocMyStruct(int num)
{
    myStruct *p = malloc( sizeof( myStruct ) );

    if( p != NULL )
    {
        p->arr1 = malloc( sizeof( int ) * 10 ); // p->arr1 now points to an array of 10 elements
        p->arr2 = malloc( sizeof( int ) * 10 * num ); // p->arr2 now points to an array of 10 * num elements
    }
    return p;
}
free( a->arr1 );
free( a->arr2 );
free( a );