从函数返回指针并保存它

时间:2017-08-22 04:23:55

标签: c

我在main函数调用之前和之后打印出e.val的值,并且值已经更改。 我是C的新手,所以想要更好地理解这一点。

由于我返回新指针并将其分配回e.val,因此e.val的值会发生变化。

问题:

1)返回并为e.val分配一个新值与将一个双指针传递给e.val基本相同吗?

#include <stdio.h>
#include <stdlib.h>
typedef struct{

  int * val;

} Event;

//qdsp_classic
int* function(int * ptr);
int* function2();
int main()
{
    Event e;
    int x = 10;
    e.val = &x; 
    printf("orig%p\n", (void *) (e.val));
    e.val = function(e.val);
    printf("New%p\n", (void *) (e.val));
    return 0;
}
int* function(int * ptr) 
{
    ptr = function2();
    printf("%p\n", (void *) ptr);
    return ptr;
}
int* function2() 
    int num = 100;
    int * newPtr = (int *) malloc(sizeof(int));
    return newPtr;
}

1 个答案:

答案 0 :(得分:3)

如果你创建了struct Event的实例,那么它在堆栈和指针内部的分配有立即值 - &gt;解除引用会导致未定义的行为。变量x也在堆栈上,并且值为10

+-------------+
|             |
|    +---+    |                   +----+
|    | * |    |                   | 10 |
|    +---+    |                   +----+
|   int* val  |                     x
+-------------+
    Event e

分配e.val = &x;到指针val后,保存变量x的地址(换句话说,val指向x

+-------------+
|             |
|    +---+    |                   +----+
|    | * |----|------------------>| 10 |
|    +---+    |                   +----+
|   int* val  |                     x
+-------------+
    Event e

int * newPtr = (int *) malloc(sizeof(int));int / 动态存储时间上创建一个heap,这是未初始化的,他的地址(第一个字节的地址)保存到指针变量newPtr

+-------------+                                    HEAP
|             |                                    ----------------
|    +---+    |                   +----+           +---+
|    | * |----|------------------>| 10 |           | ? |
|    +---+    |                   +----+           +---+
|   int* val  |                     x                ^
+-------------+                                      |
    Event e                                          |
                                                     |
     +---+                                           |
     | * |--------------------------------------------
     +---+
  int* newPtr

newPtr会被返回并保存到e.val.,这意味着e.val不再指向x,但现在指向堆上的int

+-------------+                                    HEAP
|             |                                    ----------------
|    +---+    |                   +----+           +---+
|    | * |----|-------            | 10 |           | ? |
|    +---+    |      |            +----+           +---+
|   int* val  |      |              x                ^
+-------------+      |                               |
    Event e          ---------------------------------

也可以通过传递**双指针来改变指针指向的位置。

void function(int ** ptr) 
{
    *ptr = function2();
    printf("%p\n", (void *) *ptr);
}

// In main
function(&e.val);