繁体   English   中英

从函数返回指针并保存

[英]Returning pointer from function and saving it

我在调用函数之前和之后在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;
}

如果创建struct Event实例,则将其分配在堆栈上,并且内部的指针具有立即值->解引用将导致未定义的行为。 变量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)); heap / 动态存储持续时间上创建一个int ,该持续时间未初始化,并且其地址(第一个字节的地址)保存到指针变量newPtr

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

返回newPtr并将其保存到e.val. 这意味着e.val不再指向x而是从现在开始指向堆上的int

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

还可以通过传递** double指针来更改指针指向的位置。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM