动态地为C中的结构分配指针数组

时间:2013-02-26 02:07:08

标签: c arrays pointers allocation structure

我在这里有这个结构:

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

在我的主函数上,我声明了这个指针:

NODE open = initOpen(size);

这是initOpen函数:

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

我这是对的吗?我可以在main函数中访问我的数组,如:open [0]打开[9]?

2 个答案:

答案 0 :(得分:1)

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

以下是动态分配数组的方法。希望能帮助到你。 通过这样做,您可以在内存不足之前将任意数量的int添加到数组中。您可以使用数组表示法访问数组,但首先使用指针: 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;
}

答案 1 :(得分:0)

首先,你应该尊重一些惯例:

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

其次,参数大小的用法是什么? 根据我的说法,分配新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);   
}

未经测试,请告知错误。