在C中更改空指针值时出现问题

在C中更改空指针值时出现问题,c,pointers,void-pointers,C,Pointers,Void Pointers,基本上,我的问题是,我试图更改valor变量中的值,以便在调用cambiar\u valor函数后,它变为25。但我的问题是它根本不会改变。我做错了什么?。我正在尝试创建一个真正通用的函数,以便根据传递给函数的数据类型,它会自动更改。在本例中,它是一个整数类型,但我在这里要做的是检查是否可以更改函数中valor变量的值 #include<stdio.h> #include<stdlib.h> void cambiar_valor(void* valor,int* val

基本上,我的问题是,我试图更改
valor
变量中的值,以便在调用
cambiar\u 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;
}
#包括
#包括
无效cambiar_valor(无效*valor,int*valor_dos){//将valor_dos赋值给valor
英勇=英勇;
}
int main(){
虚无*勇敢;
int*valor_dos=25;
柬埔寨的英勇(英勇,英勇);
printf(“%d\n”,(int*)valor);//这应该显示25
返回0;
}
这里

 int *valor_dos = 25;
您正在初始化一个指向值为25的int的指针。。也就是说,它指向内存位置25,这只会导致故障。我很惊讶你没有出现seg故障。

这里

您正在初始化一个指向值为25的int的指针。。也就是说,它指向内存位置25,这只会导致故障。我很惊讶你的功能没有出现seg故障。

void cambiar_valor(void* valor,int* valor_dos) {//assign valor_dos to valor
    valor = valor_dos;
}
您正在按值传入指针,这意味着
valor
valor_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
是不正确的,可能会在运行时导致segfault。你可能也想改变这一点

希望这有帮助

在您的函数中

void cambiar_valor(void* valor,int* valor_dos) {//assign valor_dos to valor
    valor = valor_dos;
}
int *valor_dos = 25
您正在按值传入指针,这意味着
valor
valor_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
是不正确的,可能会在运行时导致segfault。你可能也想改变这一点

希望这有帮助

int *valor_dos = 25
这种说法是不正确的。您在此处声明了一个指针,因此无法为其赋值(25)


这种说法是不正确的。您在此处声明了一个指针,因此无法为其赋值(25)

不存在segfault,因为指针未重新分配。我认为我们两个答案的结合是正确的答案。:-)@nhathdh-对不起。。。这篇文章有错误吗?我不确定您要我更改什么。没有SEGFULT,因为指针没有重新分配。我认为我们两个答案的结合是正确的答案。:-)@nhathdh-对不起。。。这篇文章有错误吗?我不确定你想让我改变什么。你可以这样做(毕竟这是C),但这只是一个非常糟糕的主意。是的,你可以这样做。指针只是整数。@templatetypedef确切地说,C的一个优点也是它的一个主要缺点,它很乐意做任何你要求它做的事情:-/你可以毫无问题地分配任何东西。问题在于取消对指针的引用。如果您运气好(或在调试时运气不好),则不会得到SEGFULT。但是,惯例是在为指针指定整数值时使用十六进制表示法,地址总是用十六进制表示。如果代码不使用十六进制表示法,但与本例中的十进制表示法一样,那么它很可能是一个bug。您可以这样做(毕竟这是C),但这只是一个非常糟糕的主意。是的,您可以这样做。指针只是整数。@templatetypedef确切地说,C的一个优点也是它的一个主要缺点,它很乐意做任何你要求它做的事情:-/你可以毫无问题地分配任何东西。问题在于取消对指针的引用。如果您运气好(或在调试时运气不好),则不会得到SEGFULT。但是,惯例是在为指针指定整数值时使用十六进制表示法,地址总是用十六进制表示。如果代码不使用十六进制表示法,但与本例中的十进制表示法一样,那么它很可能是一个bug。它现在可以工作了,但我想知道,由于您所说的,声明指针的最佳方法是什么,我一直认为,当我做
int*valor\u dos=25
时,我是在改变
valor\u dos
变量中的值,而不是指针将指针设置为地址25,执行
int*valor\u dos*勇气=25让指针未定义,并在未定义的地址写入25。最接近你想要做的正确匹配是
intv;int*valor_dos=&v*valor_dos=25
将指针设置为允许写入的位置,然后在该位置写入25。您也可以使用
malloc()
而不是实例化
v
,但是如果您是C的初学者,那么动态分配就更难处理了。它现在可以工作了,但是我想知道,由于您所说的,哪种方法是声明指针的最佳方法,我一直认为,当我做
int*valor\u dos=25
时,我是在改变
valor\u dos
变量中的值,而不是指针将指针设置为地址25,执行
int*valor\u dos*勇气=25让指针未定义,并在未定义的地址写入25。最接近你想要做的正确匹配是
intv;int*valor_dos=&v*valor_dos=25
将指针设置为允许写入的位置,然后在该位置写入25。您也可以执行
malloc()
而不是实例化
v
,但是如果您是C语言的初学者,动态分配就更难处理。