0

我正在开发一个应用程序,在该应用程序中遇到了包含多个“\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个字节,但是我得到了分段错误。

难道我做错了什么?十六进制或八进制数字是这样的吗?

谢谢

4

3 回答 3

3
"\037\000\000\000\000\037\037\037"

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

然后:

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

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

于 2013-03-23T17:47:20.843 回答
1

难道我做错了什么?

确实。首先,您将指针重新分配content给其他东西,从而有效地泄漏分配的内存。

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

于 2013-03-23T17:47:57.567 回答
1

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

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

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

memcpy(content, "\037\000\000\000\000\037\037\037", 8);
于 2013-03-23T17:59:28.813 回答