我有这个功能让我很难过:
char * repeat_char(const char c, const int times, char *result) {
for (int i = 0; i < times; i++) {
*(result + i) = c;
}
return result;
}
您可能会告诉我我正在尝试重复c
times
次并将结果存储在字符串result
中(字符指针)。
我这样调用它:
char *result = "";
repeat_char('o', 3, result); // hoping for "ooo"
但我得到的只是一个令人讨厌的事情:
RUN FINISHED; Segmentation fault; core dumped; real time: 160ms; user: 0ms; system: 0ms
我真的很困惑。任何人?感谢
答案 0 :(得分:5)
那是因为您正在尝试更改为不可修改的字符串文字。这就是你得到错误的原因。这是undefined behavior。
分配动态分配的内存并将指针传递给它 - 或 -
只需传递一个不是字符串文字的char数组。
确保传递的字符串足以保存结果。(以及'\0'
)这不是强制性的。你可以有一个char数组而不终止NUL
,但是你不能在标准的字符串函数中使用它,它需要NUL
终止的char数组。
解决方案是使用
之类的东西char *result = malloc(10);
// check the return value of malloc.
// if result is not NULL pass it.
或
char result[10];
另外不要忘记放'\0'
(由于上述原因)。
那么它也会让你在尝试访问数组索引时出现分段错误。
char *str = ""
基本上指向一个包含\0
的单个元素数组,该数组基本上被衰减为指向数组的第一个元素的指针,即char
并被赋值给{ {1}}。因此,您只有str
个元素,而无法将1
字符放在3
处。
分段错误意味着您正在访问一些您不应该访问的内存。
答案 1 :(得分:4)
在C中,不得修改字符串文字。任何修改字符串文字的尝试都将导致未定义的行为。您可以使用大小为times
的char数组,而不是字符串文字。
更改
char *result = "";
到
char result[3];