【问题标题】:pointer to char array, unhandled exception指向 char 数组的指针,未处理的异常
【发布时间】:2013-11-20 12:04:57
【问题描述】:

我是 C++ 新手,我正在玩指针。我不明白为什么这段代码对我不起作用。你能告诉我它有什么问题吗?

char * name = "dharman";
char *ptr = name+3;
*ptr = 'a';

printf("%s", name);

我总是遇到未处理的异常。

【问题讨论】:

  • 您应该启用编译器警告 - 它们对于查找错误非常有用,包括这个错误。即使你的编译器已经过时到允许这种狡猾的转换,它仍然应该给出警告。

标签: c++ pointers char


【解决方案1】:

这本身就是一个错误:

char * name = "dharman";

字符串在常量内存中,但是指针的类型表明它可以被修改。尝试修改它会产生未定义的行为:在其他平台上该程序可以工作,但你很不幸。

这是 C++03 中的一个怪癖;较新的 C++11 规范使其非法。这样做的原因是 C 兼容性。

无论您是用 C++ 还是纯 C 编写,解决方案都很简单:

char name[] = "dharman";

现在编译器将数据存储在读写内存中,因为您要求的是 char 数组,而不是指向其他内存的指针。

【讨论】:

    【解决方案2】:

    字符串文字,如@9​​87654321@,是只读的,您不能修改它们。相反,创建并初始化一个非只读数组。

    char name[] = "dharman";
    

    【讨论】:

      【解决方案3】:

      name 是指向字符串文字"dharman" 的指针,它位于只读内存中。
      在您的声明 *ptr = 'a' 中,您正在尝试修改此字符串文字,从而导致 Undefined Behavior

      【讨论】:

        【解决方案4】:

        它不起作用,因为"dharman" 是常量,它是一个字符串文字。你不能改变它!

        字符串字面量通常放在内存的只读段中。

        【讨论】:

        • 怎么是常数,我没声明成常数。
        • @Dharman:字符串文字是不变的——这就是语言的工作原理。
        【解决方案5】:

        您正在尝试修改常量字符串。 您需要先将常量复制到您拥有的某个内存中。 试试这个:

        char *name = (char*) malloc(10);
        memcpy(name, "dharman", strlen("dharman"));
        ...
        

        【讨论】:

          【解决方案6】:

          您将name 设置为指向const 字符串,然后尝试修改它。将字符串复制到可修改的位置:

          char *name = (char*) malloc(strlen("dharman") + 1);
          memcpy("dharman", name, strlen("dharman") + 1);
          

          【讨论】:

            【解决方案7】:

            在您的情况下未处理异常的原因是。在您的代码中

            char *ptr= name+3;
            

            考虑name的基地址为eg:23300,所以char *ptr =name+3等于 23300+(3*sizeof(char)).so 现在 ptr 指向 23300+(3*1)=23303.每个元素占用 char 一个 bye,所以 ptr 将指向 "dharman" 中的字母 'a'。因为 "dharman " 是 char const 你不能它的值这就是你得到错误的原因。如果你删除 *ptr=3 行。代码将毫无问题地工作。我希望这篇文章对你有用。

            【讨论】:

            • 这是我得到的最愚蠢的答案!
            猜你喜欢
            • 2018-04-05
            • 2021-01-26
            • 2016-01-27
            • 2012-03-19
            • 1970-01-01
            • 1970-01-01
            • 2010-11-01
            • 2017-09-03
            • 1970-01-01
            相关资源
            最近更新 更多