windows 7下的C++指针

C++ pointers under windows 7

本文关键字:指针 C++ 7下 windows      更新时间:2023-10-16

只要将值分配给在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;

由于字符串池,默认情况下s1s2是不可变的。

char *s1 = "Hello";

这里,"Hello"是字符串文字,根据定义是consts1是指向该字符串文字的第一个元素的指针,因此指向只读内存。您无法更改只读内存,因此也无法更改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与字符串文字完全分离,现在你可以随心所欲地修改它。