【问题标题】:Problems changing a void pointer value in C在 C 中更改 void 指针值的问题
【发布时间】:2012-06-15 04:21:23
【问题描述】:

基本上我的问题是我试图更改 valor 变量中的值,以便在调用 cambiar_valor 函数后它变为 25。但我的问题是它根本没有变化.我在这里做错了什么?我正在尝试制作一个真正通用的函数,以便根据我传递给函数的数据类型,它会发生动态变化。在这种情况下是一个整数类型,但我在这里要做的是检查我是否可以更改函数内valor 变量的值

#include<stdio.h>
#include<stdlib.h>

void cambiar_valor(void* valor,int* valor_dos) {//assign valor_dos to valor
    valor = valor_dos;
}

int main() {
    void *valor;
    int *valor_dos = 25;
    cambiar_valor(valor,valor_dos);
    printf("%d \n",(int*)valor);//this should show 25
    return 0;
}

【问题讨论】:

    标签: c pointers void-pointers


    【解决方案1】:

    在你的函数中

    void cambiar_valor(void* valor,int* valor_dos) {//assign valor_dos to valor
        valor = valor_dos;
    }
    

    您按值传递指针,这意味着valorvalor_dos 是您传入的参数的副本。在函数内部重新分配valor 对调用函数没有影响。

    要解决这个问题,请通过指针获取参数:

    void cambiar_valor(void** valor, int* valor_dos) {//assign valor_dos to valor
        *valor = valor_dos;
    }
    

    然后调用

    cambiar_valor(&valor, valor_dos);
    

    另外,正如@Levon 所提到的,您在main 中对valor_dos 的初始化不正确,可能会在运行时导致段错误。你可能也想改变它。

    希望这会有所帮助!

    【讨论】:

    • 它现在可以工作了,但我想知道这是声明指针的最佳方式,因为你所说的,我一直认为当我这样做时int* valor_dos = 25我正在改变值在valor_dosvariable 里面而不是它的指针。
    • mayhem,int* valor_dos = 25; 将指针设置为地址 25,int* valor_dos; *valor_dos = 25; 让指针未定义并将 25 写入未定义的地址。与您想要做的最接近的正确匹配是int v; int* valor_dos = &amp;v; *valor_dos = 25,它将指针设置到允许您写入的位置,然后在那里写入 25。您也可以使用malloc() 而不是实例化v,但如果您是 C 初学者,则动态分配更难处理。
    【解决方案2】:

    这里

     int *valor_dos = 25;
    

    您正在初始化一个指向值为 25 的 int 的指针。即,它指向内存位置 25,这只会导致麻烦。我很惊讶你没有遇到段错误。

    【讨论】:

    • 没有段错误,因为没有重新分配指针。我认为我们两个答案的结合是正确的答案。 :-)
    • @nhathdh- 抱歉...帖子中有错误吗?我不确定你想让我改变什么。
    【解决方案3】:
    int *valor_dos = 25
    

    这个说法是错误的。您在这里声明了一个指针,因此您不能为其分配值 (25)。

    【讨论】:

    • 可以做到这一点(毕竟这是 C),但这只是一个非常糟糕的主意。
    • 是的,你可以做到这一点。指针只是整数。
    • @templatetypedef 没错,C 的优势之一也是也是它的主要弱点之一,它会很乐意做任何事情你要求它做:-/
    • 您可以毫无问题地分配任何内容。问题是当您取消引用指针时。如果运气好(或者调试时运气不好),就不会得到 SEGFAULT。
    • 但是,约定是在将整数值分配给指针时使用十六进制表示法,地址始终以十六进制表示。如果代码不使用十六进制表示法,但在本例中为十进制,那么它很可能是一个错误。
    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2019-02-03
    • 2020-09-13
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多