我正在尝试在以下代码中实现一个简单的字符串副本。
但是,我在“* d = * c;”行中遇到了运行时错误。
有人能告诉我这有什么问题吗?
void test3()
{
char *a="123456";
char *b="000000";
char *c=a;
char *d=b;
while(*c){
*d = *c;
cout << *c << endl;
c++;
d++;
}
*d='\0';
}
答案 0 :(得分:6)
您无法更改const数据。您提供的这些字符串(文字字符串)存储在程序的只读区域中。实际上,您在程序中提供的任何字符串文字(例如"000000"
)都被视为const char*
(指向常量字符的指针),因此不允许(至少不建议)修改它们。< / p>
答案 1 :(得分:5)
基本上,字符串litterals是常量,不能更改。在以下行中:
char *a="123456";
char *a
应替换为const char * a
,因为a
指向一块常量内存。在函数的下方,您尝试更改常量内存块,这会产生运行时错误。
要获得可在此类函数中使用的真实字符数组,应使用:
char a[] = "123456";
这将生成一个可以自由操作的可变(非常量)数组。
答案 2 :(得分:2)
您正在尝试修改文字,编译器通常将其放在可执行文件的只读部分中;现代处理器具有硬件锁,可以防止病毒发生这种情况。
您可以通过提供自己的字符数组来修复它,可以使用文字初始化:
char b[] = "000000";
答案 3 :(得分:2)
*d=*c
和*d='\0'
都被破坏了,因为您可能无法更改来自字符串文字的这些值。它们是不可修改的。如果您按照预期使用const
,那么您就不会犯这个错误。
答案 4 :(得分:1)
由于您已将指针c和d分配给常量字符串,因此无法更改它们!您需要为d分配一个char数组才能使其正常工作:
char d[MAX_CHAR];