在struct中保存指向数组的指针

时间:2015-04-21 10:32:23

标签: c malloc dynamic-memory-allocation local-variables

在struct中保存指向数组的指针。 我想将指向int数组的指针存储到struct中,但是我遇到了麻烦。

我的代码下面有评论:

typedef struct _index {
    int *data;
} Index;

void adder(struct _index *s){
    int i;
    int arr[maxint];
    for(i=0; i<maxint; i++) {
        arr[i] = i+42;
    }

    //i got a gibberish
    //s->data = arr;

    //works fine
    s->data = (int *) malloc(maxint * sizeof(int));
    s->data = memcpy(s->data, arr, maxint * sizeof(int));
)

int main() {
    Index n;
    int i;

    //this method also works.
    //int arr[maxint];
    //for(i=0; i<maxint; i++) {
    //  arr[i] = i+42;
    //  
    //}
    //n.data = arr; 

    adder(&n);
    for(i=0; i<maxint;i++) {
        printf("%d-", n.data[i]);
    }//testing
    return 0;
}

当我完成作业时,我得到了奇怪的数字: 117-118-119-120-12-0-22-2292964-0-2293008-127-0-129-130-131-0-0-0-0-0-0-138-0

但如果我使用mallocmemcpy一切正常

3 个答案:

答案 0 :(得分:2)

你在第一种情况下得到了胡言乱语,因为你试图通过指针从函数“返回”局部变量的地址。函数完成执行后,int arr[maxint];将无效。换句话说,在adder()完成执行后,int arr[maxint];超出范围并且它的生命周期结束。因此,(返回的)指针变为无效,并且在调用者函数中进一步使用该指针将导致undefined behaviour

解决方案:

  1. 正确使用动态内存。
  2. 使用static变量(不是一种好方法,但可能)。
  3. 在上述两种方法中,变量(静态arr数组/ malloc() ed memory)的生命周期不限于函数范围,因此,指向meory的指针将在来电功能。

答案 1 :(得分:0)

arr函数中的数组adder()位于堆栈中,只有该函数中的代码正在运行时才存在。一旦adder()返回,该程序的其余部分将重复使用该内存,并覆盖其内容。

答案 2 :(得分:0)

int arr[]放在堆栈上,当它超出范围时从堆栈中删除。所以你会指向垃圾 如果你把它包含在你的主体中它可以正常工作,因为它还没有超出范围。 Malloc可以工作,因为你分配内存而不只是将它放在堆栈上。