将指针传递给函数并更改它指向的地址[重复]

Posted

技术标签:

【中文标题】将指针传递给函数并更改它指向的地址[重复]【英文标题】:Passing a pointer to a function and change the address it points to [duplicate] 【发布时间】:2020-01-25 06:28:40 【问题描述】:

对于一段嵌入式代码 (avr-gcc),我正在尝试减少堆栈内存使用量。所以我想做的是创建一个指针,将它传递给一个函数,然后在函数中,将指针指向的地址更改为堆分配变量的地址。这样,main() 内部就不会为 testPointer 分配堆栈内存。

我正在尝试使用以下代码

#include <stdio.h>
char hello[18] = "Hello cruel world";
char* myfunc2() 
        return hello;

void myfunc(char *mypointer) 
        mypointer = myfunc2();

int main()
        char *testPointer;
        printf("hello: %p\n", &hello);
        printf("test: %p\n", &testPointer);
        myfunc(testPointer);
        printf("test: %p\n", &testPointer);
        printf("test value: %s\n", testPointer);
        return 0;

但 testPointer 地址不会被重新分配。当然,在现实世界中,myfunc2 的用例不会那么简单,但它返回一个指向堆分配字符数组的指针。

输出:

hello: 0x404030
test: 0x7ffe48724d38
test: 0x7ffe48724d38
test value: (null)

【问题讨论】:

你需要研究一下静态存储和堆的区别。您的 AVR 程序中应该没有堆,并且此源中没有堆分配。此外,做你试图减少堆栈使用的方法是无稽之谈。相反,您应该专注于实际杀死 MCU 上所有内存的原因,首先将 stdio.h 扔到它所属的垃圾中。 【参考方案1】:

您传递一个指向您要写入的位置的指针。比较:

#include <stdio.h>
char hello[18] = "Hello cruel world";
char* myfunc2() 
        return hello;

void myfunc(char **mypointer) 
        *mypointer = myfunc2();

int main()
        char *testPointer;
        printf("hello: %p\n", &hello);
        printf("test: %p\n", &testPointer);
        myfunc(&testPointer);
        printf("test: %p\n", &testPointer);
        printf("test value: %s\n", testPointer);
        return 0;

【讨论】:

【参考方案2】:

你需要传递双指针。

一般来说,如果你想改变一些其他函数的值,你需要将该变量的地址传递给其他函数。这样一来,您正在尝试更改存储在变量中的地址,因此您需要传递指针变量的地址。

void myfunc(char **mypointer)  //Get address of a pointer variable
        if(NULL != mypointer ) //Check if variable is NULL
            *mypointer = myfunc2(); //Otherwise, update the pointer value

用指针变量的地址调用函数:

myfunc(&testPointer);

【讨论】:

【参考方案3】:

我真的不明白你想做什么,但无论如何,关于你的代码有两个问题:

1) 你按值传递函数参数。它应该通过引用传递

2)您通过&amp;hello打印变量的地址:它表示存储指针的地址而不是它指向的地址(即变量hello的值)。

你应该这样做:

#include <stdio.h>
char hello[18] = "Hello cruel world";
char* myfunc2() 
        return hello;

void myfunc(char **mypointer) 
        *mypointer = myfunc2();

int main()
        char *testPointer;
        printf("hello: %p\n", hello);
        printf("test: %p\n", testPointer);
        myfunc(&testPointer);
        printf("test: %p\n", testPointer);
        printf("test value: %s\n", testPointer);
        return 0;

输出是:

hello: 0x601040                                                                                                             
test: (nil)                                                                                                                 
test: 0x601040                                                                                                              
test value: Hello cruel world

请注意,第一次打印指针test的值时,它是空指针。它不是存储变量test的地址。

但是,我看不出这段代码应该做什么......

【讨论】:

我猜这只是一些用来玩指针的测试代码!

以上是关于将指针传递给函数并更改它指向的地址[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将指向常量的指针作为参数传递时出现问题

将c ++引用的地址传递给指针

将指向局部变量的指针传递给函数:它安全吗?

如何在 STL 中使用指向向量的指针,就像我们在将数组地址传递给另一个函数时将指针分配给数组一样?

成员结构的值在作为指针传递给函数后丢失

如何将指针传递给字符串,指向子字符串的指针,并返回其他内容?