【问题标题】:dynamically allocate arrays of pointers to structures in C动态分配指向 C 中结构的指针数组
【发布时间】:2013-02-26 02:07:08
【问题描述】:

我这里有这个结构:

typedef struct _open {
    int x;
    struct _open *next;
} *NODE;

在我的 main 函数中,我声明了这个指针:

NODE open = initOpen(size);

这是 initOpen 函数:

NODE initOpen(int size) {
    return (NODE)malloc(sizeof(struct _open)*size);
}

我说的对吗?我可以在主函数中访问我的数组吗:open[0] to open[9]?

【问题讨论】:

  • 为了创建指向结构的指针数组,我可以在代码中进行哪些更改?
  • 您的标题说“分配指向结构的指针数组”,但从您的代码中,您似乎想要分配结构数组(而不是指针数组)。是哪个?

标签: c arrays pointers allocation structure


【解决方案1】:

首先,你做动态分配数组的方式是错误的。
我不确定你是否真的想要你写的东西,即链表,还是你所说的东西,即动态分配的数组

下面是你应该如何做动态分配的数组。希望能帮助到你。 通过这样做,您可以在内存不足之前将任意数量的整数添加到数组中。您可以使用数组表示法访问数组,但首先使用指针:darray->array[0]

但是,您的链表无法使用此语法访问。

#include <stdio.h>
#include <stdlib.h>

#define INITSIZE 8

typedef struct dyarr{
    int num;
    int max;
    int *array;
}arr;

arr* makeArr();
void add( arr*, int );

int main( int argc, char const *argv[] ){
    int t;
    arr* darray = makeArr();
    while( scanf( "%d", &t ) != EOF ){
        add( darray, t );
    }
    int i;
    for( i = 0; i<darray->num; i++ ){
        printf( "%d\n", darray->array[i] );
    }
    getchar();
    return 0;
}

arr* makeArr(){
    arr* A = malloc( sizeof( arr ) );
    A->max = MAXSIZE;
    A->num = 0;
    A->array = malloc( sizeof( int )*A->max );
    return A;
}

void add( arr* a, int i ){
    if( a->num == a->max ){
        a->max *= 2;
        a->array = realloc( a->array, a->max );
    }
    a->array[a->num++] = i;
}

【讨论】:

    【解决方案2】:

    首先,你应该尊重一些约定:

    typedef struct node {
        int x;
        struct node *next;
    } *nodePtr;
    

    第二,参数size的用途是什么? 根据我的说法,分配新 nodePtr 的正确方法是:

    nodePtr initNodePtr() {
        return (nodePtr)malloc(sizeof(struct node));
    }
    

    使用后别忘了释放内存:

    nodePtr node = initNodePtr();
    ...
    ...
    free(node); //should be wrapped in a function to respect design.
    

    要创建结构数组,您应该执行以下操作:

    typedef struct {
        int x;
        node* next;
    } node;
    
    int main() {
        node* nodeArray = (node*)malloc(sizeof(node)*50); // 50 = size of your array
        ...
        // do whatever you want
        ...
        free(nodeArray);   
    }
    

    未测试,如有错误请告知。

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 1970-01-01
      • 2013-04-18
      • 2016-02-22
      • 2020-05-17
      • 2011-01-02
      • 2022-01-24
      • 2022-01-14
      • 2021-12-14
      相关资源
      最近更新 更多