char* 的写入权限

问题描述 投票:0回答:4

巧合的问题:需要能够在 C++ 中修改 char* 的内容。

我有一个有点像这样的函数: char* buffer = (char*)FUNCTION

现在我需要修改“缓冲区”,例如做这样的事情 buffer[1] = "h";

我尝试过的方法如下: char *string = "你好世界"; 字符缓冲区[65]; //我还需要知道确切的大小 strcpy(缓冲区,字符串); 缓冲区[1] =“r”;

我也尝试过使用malloc。 不幸的是,编译器总是抱怨以下内容:“无法从 const char[2] 转换为 char”。这种情况发生在 Windows 上。 我的 g++ 编译器没有这样的问题。

我已经查看了以下链接,但仍然无能为力。

谢谢

c++ char
4个回答
5
投票

由于您的问题被标记为 C++,我必须质疑您使用原始 char* 的意图,除非您非常有信心,否则不建议这样做。

其次,修改 char* 或 char[] 是完全有效的。您遇到的问题是您在“Hello World”中创建了一个 const char*,然后尝试使其中的一个字符等于一个字符串。字符不是字符串。 “r”是一个字符串,它是一个const char*。所以你试图将 const char* 等同于 char,这是一个错误。你真正的意思是“r”,它是一个字符。

更好的代码是:

std::string mystring((char*)FUNCTION); // assume that FUNCTION
                                       // will free it's own memory.
if (index < mystring.size())
    mystring[index] = 'r';
// mystring now cleans up it's own memory in all cases.

4
投票

您无法更改 *char string = "Hello World" 因为字符串是“只读”,但您可以使用 char string[] = .. 它将编译器排列成可修改的数组:

    char * strReadOnly = "read-only-data";
    //strReadOnly [3] = '0'; //access violation 
    char stReadWrite [] = "read-write-data";
    stReadWrite [3] = '0'; // Ok, but just make sure that indexes are in range

要将字符串复制到另一个可以更改的缓冲区中,可以执行以下操作:

 char * src = "read-only-data";
 const int len = strlen(src);
 char * dst = new char[len+1];
 strcpy(dst, src); 
 dst[3] = '0'; // ok to change

 delete [] dst; // don't forget to delete dst

3
投票

你的问题在引号中,如果你想从编译器中得到

char
,你必须使用''
""
是一个字符串并且有一个null终止(一个char)然后你会得到错误char[ 2] (char + null) 到字符


尝试

*(buffer + x) = 'h';

x - 是要更改的字符位置。


2
投票

你必须明白以下两行之间是有区别的:

char  myArray[] = "Hello Mars!";
char* myPointer = "Hello World!";

第一个创建一个可以操作的字符数组。整个数组将在堆栈上分配。

第二个使用字符串文字初始化指向 char 的指针(C 语言的一种特殊构造允许这样做)。这被认为是一个常数。你会得到它的地址,但它实际上是一个 const 字符数组。实现如下:

该字符串将按字面意思存储在内存中的可执行映像中(作为硬盘上文件的相同副本),并且您将获得指向该字符串的指针。堆栈上将为指针

myPointer
留出空间。将字符串文字视为代码中的文字数字(是的,我正在谈论的幻数)。编译器需要将这些字符存储在某处,但这不是您通常在程序中使用的内存类型。它不在堆上,也不在堆栈上。有关更多信息,请参阅以下问题的答案:

C++中的全局内存管理是栈还是堆?

编辑:关于指针和数组

使其不可变的不是

char*
,而是字符串文字。指针和数组非常相关。数组的行为通常类似于指针。考虑到上面的代码,这是完全合法的:

myPointer = myArray;

myPointer
不是 const,您可以将其更改为指向
myArray
的地址而不是字符串文字。它指向的地址是只读的。现在
myPointer
指向堆栈上存储
"Hello Mars!"
的地址。你现在可以写:

myPointer[3] = 'Z';

如果您想对此有透彻的了解,请阅读一些教程,例如this one

关于常量

Const 可能会令人困惑,尤其是对于指针而言。

const char* const myPointer2 = myPointer;

第一个 const 使字符成为 const,因此您不能使用

myPointer2
来更改它们,第二个 const 使指针本身成为 const,因此您不能让它指向其他内容,例如
myPointer2 = myArray;

请参阅此说明了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.