Null指针有什么问题
Whats wrong with the Null pointer
我正在练习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数组或指针时,您需要了解更多关于语言细节的信息。从一个好的教程或一本好的书开始。有些时间是不够的,但有些日子应该足够了。
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- c++无值sort()的问题是什么?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 基本的 c++ 问题:如果我在函数中创建某些内容并返回它会发生什么?
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 什么是钻石问题?是一系列问题还是特定问题?
- 格式说明符C++有什么问题
- 我应该在 main 函数中写什么来测试我的问题?
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 方法问题 - 什么会改变值,什么不会改变?什么是无效的?