C语言 在结构中保存指向数组的指针



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

在我的代码下面有注释:

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-0-138-0

但是如果我使用 malloc 并且memcpy一切正常

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

溶液:

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新