Alf*_*ara 5 c segmentation-fault
我试图找出为什么我不能通过使用strcpy()命令将字符存储到我的char指针.当我运行下面的代码时,我得到一个seg错误.
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char *str1, *str2;
int ret;
strcpy(str1, "abcdefg"); // stores string into character array str1
strcpy(str2, "abcdefg");
printf("contents of %s \n", str1);
ret = strncmp(str1, str2, strlen(str2)); /* compares str1 to str2 */
if (ret > 0) {
printf("str1 is less than str2\n");
}
else if (ret < 0) {
printf("str2 is less than str1\n");
}
else if (ret == 0) {
printf("str1 is equal to str2\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
boa*_*ter 10
眼下,str1并且str2仅会指向一个字符.当你这样做时strcpy(str1, "abcdefg"),它会尝试将字符串"abcdefg"中的字符写入str1指向并str1指向未知内存的内存中,这可能是您没有任何写入权限,因此会出现分段错误.
修复它的一种方法是在堆上分配内存,然后存储这些字符串.
#include <stdlib.h>
...
/* assuming the max length of a string is not more than 253 characters */
char *str1 = malloc(sizeof(char) * 254);
char *str2 = malloc(sizeof(char) * 254);
Run Code Online (Sandbox Code Playgroud)
您也可以strdup像Gangadhar提到的那样复制字符串.
另一种方法是在编译期间声明str1和str2作为数组,如Bryan Ash建议的那样
char str1[] = "abcdefg";
char str2[] = "abcdefg";
Run Code Online (Sandbox Code Playgroud)
如果你想动态分配字符串而不是在堆上,你可以使用alloca(更多细节阅读http://man7.org/linux/man-pages/man3/alloca.3.html),因为kfsone注意到