我创建了一个更改字符串的函数,请参阅以下代码。
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吗?
答案 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
备注:强>
在所有情况下,字符串“Hi”都放在程序的代码部分中。
在上一个示例中,该字符串的内容被复制到buff
数组中。
在最后一个示例中,如果buff
是非静态局部变量,则buff
数组位于堆栈中,否则位于程序的数据部分中。