2015-04-21 53 views
0

保存指向结构体中数组的指针。 我想将指向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一切工作正常

+0

arr在堆栈上,它是一个局部变量。不要施加'malloc'结果 –

回答

2

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

解决方案:

  1. 如你做得正确,使用动态内存。
  2. 使用static变量(不是一个好方法,但可能)。

在上述两种方法中,变量的生存期(静态arr阵列/ malloc() ED存储器)不限于功能范围,因此,该指针meory将在调用方函数vaild。

+0

感谢您的详细解答。 – cyan

+0

@cyan不客气。 :-) –

+0

为什么静态变量不是一个好方法?我试图理解这部分:-) – cyan

0

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

0

int arr[]放置在堆栈上,并在堆栈超出范围时从堆栈中移除。所以你会指向垃圾。
它可以正常工作,如果将它包含在主体中,因为它尚未超出范围。 Malloc的工作原理是分配内存,而不是将其放在堆栈上。