windows 7下的C++指针
C++ pointers under windows 7
只要将值分配给在windows7(32位)环境下不工作的任何指针变量。包含此类代码的程序出现执行错误。实际上,我试图在不使用任何库函数的情况下连接两个字符串。示例:
int main()
{
char *s1 = "Hello";
char *s2 = "World";
char *p;
p = s1;
while(*s1 != ' ')
s1++;
while(*s2 != ' ')
{
*s1 = *s2; // this line creating problem
s1++;
s2++;
}
*s1 = ' '; // this line also creating problem
while(*p != ' ')
{
cout<<*p;
p++;
}
return 0;
}
您没有分配写入空间——这就是您遇到问题的原因。
您已经创建了s1
,并将其指向某个只读内存,当您尝试附加时,您正在写入该区域。
相反,您可以将p
设置为指向某个内存,该内存a)您拥有(有权写入,而不仅仅是物理能力),b)足够大,可以进行完全分配。
最简单的方法是使用std::string
——毕竟,您说您使用的是C++。
char *s1 = "Hello";
char *s2 = "World";
当你像这样创建s1和s2时,你不能写:
*s2 = anything;
由于字符串池,默认情况下s1
和s2
是不可变的。
char *s1 = "Hello";
这里,"Hello"
是字符串文字,根据定义是const
。s1
是指向该字符串文字的第一个元素的指针,因此指向只读内存。您无法更改只读内存,因此也无法更改s1
所指向的内容。如果你把它声明为:,它会更符合要求,也会更好
const char *s1 = "Hello";
在C++03中,有一个特殊的规则,允许将指向字符串文字的指针分配给非const
指针。然而,该规则在C++11中被删除了,您的代码现在实际上是非法的。
这是一件好事,因为即使在C++03中,也没有什么可以(合法地)对s1
做的事情是const
做不到的。
后来,你做了一件明显错误的事情:
while(*s2 != ' ')
{
*s1 = *s2; // this line creating problem
s1++;
s2++;
}
我对这行代码给您带来问题并不感到惊讶——它唤起了Undefined Behavior,因为您正在修改只读内存。
看起来你真正想做的是创建一个用已知(不变)值初始化的字符串,然后修改这个字符串。为了做到这一点,您必须制作字符串文本的副本。最简单的方法是使用std::string
:
std::string s1 = "Hello";
这里"Hello"
仍然是一个字符串文字,但s1
是由它构建的。s1
与字符串文字完全分离,现在你可以随心所欲地修改它。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错