【问题标题】:Handling multiple '\000' in string with increasing ASCII value处理字符串中的多个 '\000' 并增加 ASCII 值
【发布时间】:2013-03-23 17:45:34
【问题描述】:

我正在开发一个应用程序,其中我遇到了包含多个“\000”终止字符的字符串。我想要字符串中的那个空字符。 在处理这个时,字符串仅在 '\000' 处终止,所以我试图增加它的 ASCII 值。但是当我这样做时,我得到了分段错误。

我在下面写了代码段

 char *content; 
 content = malloc(8);
 content = "\037\000\000\000\000\037\037\037";
 int content_length = 8;
 content[1] = content[1] + 1;    // Increasing the ASCII value

在这里,如果我删除增加 ASCII 值的最后一行,我的应用程序中只会收到 1 个字节。所以已经改变了第二个字节(内容[1])然后应该传输2个字节,但是我得到了分段错误。

我做错了吗?十六进制或八进制数字会产生这样的结果吗?

谢谢

【问题讨论】:

    标签: c string data-structures


    【解决方案1】:
    "\037\000\000\000\000\037\037\037"
    

    是一个字符串文字。字符串文字在 C 中是不可修改的。写入字符串文字是未定义的行为。

    然后:

    content = malloc(8);
    content = "\037\000\000\000\000\037\037\037";
    

    您从 malloc 获得了一些内存,但您正在覆盖指针对象以使其指向 elsewehere(字符串字面量),这称为 内存泄漏

    【讨论】:

      【解决方案2】:

      您需要创建存储空间。要么用它初始化一个数组:

      char content[] = "\037\000\000\000\000\037\037\037";
      

      或者如果你想使用malloc而不是数组,你可以使用memcpy复制确切的字节数:

      memcpy(content, "\037\000\000\000\000\037\037\037", 8);
      

      【讨论】:

        【解决方案3】:

        我做错了吗?

        当然。首先,您将 content 指针重新分配给其他对象,从而有效地泄漏分配的内存。

        其次,引号之间的字符串是字符串文字,其内容不能被修改。您的程序调用了未定义的行为。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-27
          • 2021-04-15
          • 1970-01-01
          • 2013-03-22
          • 2011-06-03
          • 2012-08-20
          • 2021-07-17
          相关资源
          最近更新 更多