C++ 如何将int和int*传递到函数中以定义变量

C++ 如何将int和int*传递到函数中以定义变量,c++,function,c++11,pointers,C++,Function,C++11,Pointers,我有一个int变量和一个int指针变量,我想把它传递到一个函数中,这个函数可以将两个变量设置为等于一个数字。我的理解是,我只需要更改setint(b,20)修复此问题的代码行 我一直试图在b变量前面添加&和*,但这导致文件无法编译 void setint(int* ip, int i) { *ip = i; } int main(int argc, char** argv) { int a = -1; int *b = NULL; setint(&a, 10);

我有一个int变量和一个int指针变量,我想把它传递到一个函数中,这个函数可以将两个变量设置为等于一个数字。我的理解是,我只需要更改
setint(b,20)修复此问题的代码行

我一直试图在
b
变量前面添加
&
*
,但这导致文件无法编译

void setint(int* ip, int i)
{
  *ip = i;
}

int main(int argc, char** argv)
{
  int a = -1;
  int *b = NULL;

  setint(&a, 10);
  cout << a << endl;
  setint(b, 20);
  cout << b << endl;
目前的输出是:

10
segment fault

您的代码做了什么/尝试了什么/失败了什么(请参阅添加的注释):

int main(int argc,char**argv)
{
int a=-1;//定义并初始化一个int变量,很好
int*b=NULL;//定义并初始化指向int的指针,尽管指向NULL。。。
//…这不是一个立即的问题
setint(&a,10);//为函数提供变量的地址,很好

cout您的代码做了什么/尝试了什么/失败了什么(请参阅添加的注释):

int main(int argc,char**argv)
{
int a=-1;//定义并初始化一个int变量,很好
int*b=NULL;//定义并初始化指向int的指针,尽管指向NULL。。。
//…这不是一个立即的问题
setint(&a,10);//为函数提供变量的地址,很好

cout您需要为b分配内存(a已经由堆栈上的编译器分配),具体如下:

#包括
int*b=(int*)malloc(sizeof(int));

您需要为b分配内存(a已由堆栈上的编译器分配),具体如下:

#包括
int*b=(int*)malloc(sizeof(int));
void setint(int*ip,int i)
{
如果(ip!=NULL)/<我们应该检查NULL以避免错误
{
*ip=i;
}
其他的
{
cout
void setint(int*ip,inti)
{
如果(ip!=NULL)/<我们应该检查NULL以避免错误
{
*ip=i;
}
其他的
{

当您尝试取消引用
b
指针时,是否会出现
分段错误
,因为
b
是空指针(即
b
指向
NULL
而不是有效的内存位置)你不允许遵从空指针。试着用
intx;int*b=&x;
之类的东西替换
int*b=NULL;
,你会得到一个更令人满意的结果。而且你可能想替换
cout@JeremyFriesner我在发布我的答案后注意到了你的评论。为什么你没有?你得到了
分段n尝试取消引用
b
指针时出现故障,因为
b
是空指针(即
b
指向
NULL
而不是有效的内存位置)而且你不允许遵从空指针。试着用类似
intx;int*b=&x;
的东西替换
int*b=NULL;
,你会得到一个更令人满意的结果。另外,你可能想替换
cout@JeremyFriesner我在发布我的答案后注意到了你的评论。为什么不呢?你也可以初始化
b
使用
b=new int(4);
但是当你使用完它时,你必须确保调用
delete b;
。@JonathonK是的,可以。选择最简单和(在我看来)最容易理解的方式。你也可以使用
b=new int(4)初始化
b
但是当你完成后,你必须确保调用
delete b;
。@JonathonK是的,可以。在我看来,选择了最简单的和最容易理解的方式……尤其是在C++中。比较JONATAANS对我的答案的评论,包括需要自由/删除。所有取决于你需要做的。如果你做B=和A然后SETIN(B,20)然后,A也将设置为20…尤其是在C++中。比较JONATAANS对我的答案的评论,包括需要自由/删除。所有取决于你需要做的。如果你做B=和A然后SETIN(B,20),那么A也将设置为20。
10
segment fault
int main(int argc, char** argv)
{
  int a = -1;    // define and init an int variable, fine
  int *b = NULL; // define and init a pointer to int, albeit to NULL, ...
                 // ... not immediatly a problem

  setint(&a, 10);    // give the address of variable to your function, fine
  cout << a << endl; // output, fine

  setint(b, 20);  // give the NULL pointer to the function, 
                  // which attempts to dereference it, segfault

  cout << b << endl;
int main(int argc, char** argv)
{
  int a = -1;
  int *b = &a; // changed to init with address of existing variable

  setint(&a, 10);
  cout << a << endl;
  setint(b, 20);      // now gives dereferencable address of existing variable
  cout << *b << endl; // output what is pointed to by the non-NULL pointer
#include <stdlib.h>
int *b = (int *)malloc(sizeof(int));
void setint(int* ip, int i)
{
  if(ip != NULL) //< we should check for null to avoid segfault
  {
    *ip = i;
  }
  else
  {
    cout << "!!attempt to set value via NULL pointer!!" << endl;
  }
}

int main(int argc, char** argv)
{
  int a = -1;
  int *b = NULL;

  setint(&a, 10);
  cout << a << endl;
  setint(b, 20);      //< should fail (b is currently NULL)
  // cout << *b << endl;

  b = &a; //< set pointer value to something other than NULL

  setint(b, 20);      //< should work
  cout << *b << endl;

  return 0;
}