【问题标题】:c++: write a char at a given char* causes segfaultc ++:在给定的char *处写一个char会导致段错误
【发布时间】:2011-06-12 09:31:20
【问题描述】:

我想将一个 char 复制到给定 char* 指向的地址。

它在 main 调用的函数中:

char data = "       ";
myfunction(data, somethingelse);
...

在函数内部我有类似的东西

void myfunction(char* data, short somethingelse) {
...
char byte = 0;
inputfilestream.read(&byte, 1);
*data = byte; // here i get the segfault
data++;
...
}

当 i 使用 strncpy 复制时,segfault 也会出现:

strncpy(data, byte, 1);

为什么会有段错误? data 不是 const 并且我实际写入的地址与我分配数据数组的地址完全相同。我已经测试过很多次了。

提前致谢。

【问题讨论】:

  • 这段代码甚至不应该编译:char data = " ";
  • 字符数据 = " "; - 你的意思是 char[] data = " "; ?

标签: c++ char segmentation-fault


【解决方案1】:

字符串文字是只读的。如果你想要一个可修改的字符串,你必须使用一个数组,例如:

char data[10];

或者:

char *data = new char[10];

再详细一点:字符串文字的类型实际上是const char*。因此,将字符串文字分配给非常量 char* 在技术上是无效的,但大多数编译器出于遗留原因仍然允许它。当您尝试这样做时,许多现代编译器至少会发出警告。

【讨论】:

    【解决方案2】:

    data 被分配了一个字符串文字。字符串文字只准备好了,写入它们会导致段错误。

    试试这个:

    char data[10]; // or whatever size you want.
    

    改为。

    【讨论】:

      【解决方案3】:

      为什么会有段错误? data 不是 const 并且我实际写入的地址与我分配数据数组的地址完全相同。

      你没有分配任何东西。 char *data = " "; 甚至不应该在 C++ 中编译。您正在将常量字符串分配给非常量。

      【讨论】:

      • 我的错误。我实际上写了 char *data = " ";但感谢您的解释!
      • 我永远无法理解为什么人们重新输入代码 - 复制和粘贴已经存在了 30 年 - 为什么有些人不使用它?
      【解决方案4】:
      char byte = 0;
      inputfilestream.read(&byte, 1);
      *data = byte; // here i get the segfault
      data++; // << How many times?
      

      没问题

      #include <stdio.h>
      
      int main(int argc, char **argv)
      {
          char *data = "Yello"; // or char data[] = "Yello";
          *data = 'H';
          puts(data); // Hello
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-23
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        • 1970-01-01
        • 2016-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多