对char *的写权限

时间:2010-06-24 09:49:55

标签: c++ char

Coincise问题:需要能够在c ++中修改char *的内容。

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

现在我需要修改'缓冲',例如做类似这样的缓冲[1] =“h”;

我尝试过的是以下内容:         char * string =“Hello World”;  char buffer [65]; //我仍然需要知道确切的大小  strcpy(buffer,string);  buffer [1] =“r”;

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

我查看了以下链接,但仍然无法做任何事情。 http://www.developerweb.net/forum/archive/index.php/t-3517.html About character pointers in C Is it possible to modify a string of char in C?

由于

4 个答案:

答案 0 :(得分:5)

由于您的问题被标记为C ++,我必须质疑您使用原始字母*的意图,除非您非常自信,否则不建议使用。

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

更好的代码是:

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.

答案 1 :(得分: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

答案 2 :(得分:3)

您的问题在引号中,如果您希望编译器中的 char ,则必须使用''""是一个字符串并且具有anditional < em> null 终止(一个 char )然后你得到错误 char [2] char + null )到


尝试*(buffer + x) = 'h';

x - 是你要改变的char的位置。

答案 3 :(得分:2)

您必须了解以下两行之间存在差异:

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

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

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

字符串将字面存储在内存中的可执行映像中(作为hdd上文件的相同副本),您将获得指向该字符串的指针。将在堆栈上为指针myPointer创建空格。将字符串文字视为代码中的文字数字(是的,我正在谈论的神奇数字)。编译器需要在某处存储这些字符,但它不是您通常在程序中使用的那种内存。它不在堆上,也不在堆栈上。有关详细信息,请参阅以下问题的答案:

Global memory management in C++ in stack or heap?

编辑:关于指针和数组

不是char*使它成为不可变的,而是字符串文字。指针和数组非常相关。数组通常表现得像指针一样。考虑到上面的代码,这是完全合法的:

myPointer = myArray;

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

myPointer[3] = 'Z';

如果您想了解这一点,请阅读this one等教程。

on constness

Const可能会让指针特别困惑。

const char* const myPointer2 = myPointer;

第一个const使字符成为const,所以你不能使用myPointer2来改变它们,第二个const使得指针本身就是const,所以你不能让它指向像myPointer2 = myArray; < / p>

有关详细信息,请参阅this explanation