通过参数将字符串文字传递为char *

时间:2014-01-15 08:02:18

标签: c++ string arguments

我创建了一个更改字符串的函数,请参阅以下代码。

void Test(char* str, char c) {
    str[1] = c;
}

int main(){
    Test("Hi", '2');
}

我注意到它造成了一些运行时错误。我知道如何防止错误。

char buff[3] = "Hi";
Test(buff,'2');

但我不知道为什么第一个例子出现了运行时错误。我想,如果我直接传递字符串,它就变成了const char。有没有人解释究竟发生了什么?

PS。 如果我使用char * str =“hi”,然后将其传递给参数?

char* buff = "Hi";
Test(buff,'2');
像这样。我可以修改buff吗?

5 个答案:

答案 0 :(得分:2)

因为"Hi"字符串文字并且不允许修改它们,所以它们是只读的(字符串文字的类型是const char[n])。

修改它是未定义的行为


关于您的修改:char* str = "hi"无效,应为const char* str = "hi"。这是指向const char的指针。同样,不允许修改它。

答案 1 :(得分:1)

如果没有为字符串显式分配内存,编译器会将它们存储在只读内存中。因此,对此类字符串的任何修改都会导致运行时错误。

Test("Hi", '2');  

在上面的例子中,“Hi”字符串存储在只读存储器中。

 char *buff = "Hi";  
 Test(buff,'2');

此处“Hi”存储在只读存储器中,起始地址返回 buff 字符指针,与上述相同。您可以通过为字符串分配内存然后传递该引用来克服此类错误。喜欢

 char buff[3] = "Hi";  
 Test(buff,'2');

char *buff = (char *)malloc(SIZE);  
strcpy(buff, "Hi");
Test(buff,'2');

请参阅此链接http://www.geeksforgeeks.org/memory-layout-of-c-program/

答案 2 :(得分:0)

字符串常量通常位于只读内存中,当您尝试修改它时会导致运行时错误。

在第二个示例中,您将字符串放入堆栈中的缓冲区,以便可以无错误地更新。

答案 3 :(得分:0)

文字字符串不可修改。当我用GCC编译代码时,我收到警告:

testptr.cpp:6: warning: deprecated conversion from string constant to 'char*'

答案 4 :(得分:0)

运行时错误:

char* buff = "Hi"; // buff points to an address in the code-section, which is a Read-Only section
buff[1] = 'x';     // Illegal memory access violation

编译错误:

const char* buff = "Hi"; // This is a correct declaration, which will prevent the runtime error above
buff[1] = 'x';           // The compiler will not allow this

一切都好:

char buff[] = "Hi"; // buff points to an address in the stack or the data-section, which are both Read-Write sections
buff[1] = 'x';      // Works OK

备注:

  1. 在所有情况下,字符串“Hi”都放在程序的代码部分中。

  2. 在上一个示例中,该字符串的内容被复制到buff数组中。

  3. 在最后一个示例中,如果buff是非静态局部变量,则buff数组位于堆栈中,否则位于程序的数据部分中。