在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语言的初学者,动态分配就更难处理。