【问题标题】:Save pointer to array in struct在结构中保存指向数组的指针
【发布时间】:2015-06-28 11:10:06
【问题描述】:

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

【问题讨论】:

  • arr 在栈上,它是一个局部变量。不要投射malloc 结果

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


【解决方案1】:

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

解决方案:

  1. 正如您所做的那样,使用动态内存。
  2. 使用static 变量(不是一个好方法,但可能)。

在上述两种方法中,变量(静态arr数组/malloc()ed内存)的生命周期不限于函数范围,因此,指向内存的指针将在调用函数中有效。

【讨论】:

  • 感谢您的详细解答。
  • 为什么静态变量不是一个好方法?我正在尝试理解这部分:-)
【解决方案2】:

int arr[] 被放置在堆栈上,并在超出范围时从堆栈中删除。所以你会指向垃圾。
如果您将它包含在您的 main 中,它会正常工作,因为这样它还没有超出范围。 Malloc 之所以有效,是因为您分配了内存,而不仅仅是将其放在堆栈上。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2017-06-03
      • 1970-01-01
      • 2012-12-07
      • 2016-06-20
      相关资源
      最近更新 更多