Null指针有什么问题

Whats wrong with the Null pointer

本文关键字:问题 什么 指针 Null      更新时间:2023-10-16

我正在练习C++,并在网上找到了这个任务。任务中的问题是"这个代码出了什么问题?">

#include <iostream>
void StrIn(char *sp)
{
  sp = new char[256];
  sp[0] = '1';
  sp[1] = '2';
  sp[2] = '';
}
int main()
{
  char *pt=0;\ something wrong here
  StrIn (pt);
  std::cout << pt[1];
  delete[] pt;
  return 0
}

首先。我不明白StrIn为什么不更改元素pt[]的值。

第二。时程序为什么会大喊

char *pt=0;

并且与配合"良好">

char *pt;

很明显,我不明白一些事情,但我花了4个小时在这项任务上,并没有找到任何解决方案,所以请您帮助。

UPD:为什么的输出

std::cout << pt;

以"-"符号结尾,并且只显示连续排列的几个符号?

您是按值传递指针的,因此在函数内部,您实际上是在分配一个新指针,而不是原始指针。

将函数原型更改为void StrIn(char *&sp)

具有整数的代码的等价物:

#include <iostream>
void ReadInt(int i)
{
  i = 2;
}
int main()
{ 
  int i = 0;
  ReadInt (i);
  std::cout << i;
  return 0
}

这里的问题是,您正在传递i的副本,在ReadInt中更改它不会更改main中的int。

有两种解决方案:

解决方案1

返回更改后的号码:

int ReadInt()
{
  return 2;
}
int main()
{ 
  int i = 0;
  i = ReadInt();
  std::cout << i;
  return 0
}

在您的情况下:

char* StrIn()
{
  sp = new char[256];
  sp[0] = '1';
  sp[1] = '2';
  sp[2] = '';
  return sp;
}
int main()
{
  char* pt = 0;
  pt = StrIn();
  std::cout << pt[1];
  delete[] pt;
  return 0;
}

解决方案2

传递变量的引用或内存位置。

对于整数:

void ReadInt(int& i) which would be called like this: ReadInt(i)
//or
void ReadInt(int* i) which would be called like this: ReadInt(&i)

在您的情况下:

void StrIn(char*& sp) which would be called like this: StrIn(pt)
//or
void StrIn(char** sp) which would be called like this: StrIn(&pt)

若要获取双指针指向的数据,您需要取消引用该指针。

char* deref = *(double_pointer);

我不明白为什么Str不改变元素pt[]的值。

当调用Str时,会将pt的值传递给它。pt是一个指针,因此该值是一个**地址*。您正在将地址传递给Str。到目前为止,一切都很好。

现在在Str中,会发生什么?你拿到地址的副本,称之为sp,并立即用新地址(new返回的地址(替换它。Str中的所有后续代码仅修改该新地址所指向的内容。原始地址未被更改。

然后Str返回,拷贝被丢弃,拷贝指向的内容永远留在内存中(直到程序结束(。

程序的其余部分处理原始地址。

为什么程序在char*pt=0时大喊down;与char配合使用"良好"*pt;

在这两种情况下,这都是未定义的(即或多或少的随机(行为。在main中,您使用原始地址,而不管Str中的副本发生了什么。0地址对[]操作无效,也没有使用未初始化的变量。

唯一真正的区别是delete[],它将通过对空指针不做任何操作而正常工作,并对未初始化的变量产生未定义的行为。

很明显,我不明白一些事情,但我花了4个小时在这上面任务,不要再接近解决方案,所以请你帮忙。

您将实际字符串误认为是字符数组或指针(即内存地址(。

在C++中,当您需要字符串时,使用std::string类,一切都将按预期工作。

当您使用char数组或指针时,您需要了解更多关于语言细节的信息。从一个好的教程或一本好的开始。有些时间是不够的,但有些日子应该足够了。