如果我有一个函数scopy,它将一个C String从src复制到dest
char * scopy(char *dest, char *src) {
char* r = dest;
while (*src != '\0') {
*dest = *src;
dest++;
src++;
}
*dest = *src;
return r;
}
为什么这个函数在调用时会起作用2字符串初始化为这样 char a [6] =" abbbb"和 char b [4] =" dcd" 但是对于像这样初始化的字符串不起作用 char * a =" abbbb"和 char * b =" dcd"
答案 0 :(得分:1)
这个函数在使用时会调用未定义的行为,因为它会尝试modify a string literal,所以你不能说它在两种情况下都有效。
它似乎适用于char[]
这是一个巧合 - 一个不幸的事实,因为它给人留下了错误的印象。
答案 1 :(得分:1)
在下面的代码中,变量ptr
指向只读内存部分,其中包含"xyz\0"
。您可以更改变量本身,但不能更改它指向的内存的内容......
char* ptr = "xyz";
在下面的代码中,变量arr
指向包含"xyz\0"
的读/写内存部分。您无法更改变量本身,但您可以更改它指向的内存的内容...
char arr[] = "xyz";
以上内容应该可以帮助您理解为什么在第一种情况下出现分段错误...
话虽如此,您的代码中还有另一个问题 - 如果src
指向的字符串比dest
指向的字符串长,那么*dest = *src
很可能会导致分段错误:
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
答案 2 :(得分:0)
char * a =" abbbb"被称为字符串文字,其中iirc的行为与c中的char []不同。具体来说,我不相信你可以修改字符串文字的单个字符。
尝试查看here以获取两个构造函数之间的更多信息