2014-01-15 91 views
1

我做了一个函数,它改变了字符串,参见下面的代码。传递字符串文字作为char *通过参数

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'); 

这样子。我可以修改爱好者吗?

+0

阅读一些有关'为const char *'。 –

+0

这不再是合法的C++(因为不应该编译)并且从来没有错。 – chris

+0

最后一个是新的,我认为它应该是'char * buff',但仍然没有。无论你如何解决这个问题,使用指向非常量数据的指针指向常量数据将永远不会工作。 – chris

回答

0

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

在第二个示例中,将字符串放入堆栈的缓冲区中,以便可以更新而不会出错。

2

由于"Hi"字符串文字并且它不允许进行修改,它们是只读的(字符串文字的类型是const char[n])。

修改它是未定义的行为


关于您的编辑:char* str = "hi"是无效的,应该是const char* str = "hi"。这是指向const char的指针。再次,修改它是不允许的。

+0

如果他声明了'char * buff =“Hi”'(这会将'buff'放在只读代码段而不是堆栈中),则为真。 –

+0

@barakmanos - 呃,什么? –

+0

@barak OP * *(隐含地)声明它。这个答案是正确的。 –

0

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

testptr.cpp:6: warning: deprecated conversion from string constant to 'char*' 
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. 在所有情况下,字符串“喜”被放置在程序的代码段。

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

  3. 在最后一个例子中,buff阵列位于所述堆叠中如果buff是一个非静态本地变量,并在程序的数据段否则。

+0

非常感谢。 :) – Sehui

0

当您不为字符串显式分配内存时,编译器会将它们存储在只读内存中。所以,对这些字符串的任何修改都会导致运行时错误。

Test("Hi", '2'); 

这里在上述情况下,“Hi”字符串存储在只读存储器中。

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

在这里也是“您好”被存储在只读存储器和所述起始地址被返回给抛光轮字符指针,这是与上述相同。您可以通过为字符串分配内存来克服此类错误,然后传递该引用。像

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/

相关问题