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