[英]Segmentation fault in my strcpy
由于以下事实,我正在编写自己的strcpy
string.h
中的默认值仅接受const char *
作为要从中复制的源字符串。 我正在尝试这个非常基本的原型(是的,回报没有意义,我只是在尝试事情):
int copyStrings(char * dest, char * source){
int i=0;
while(source[i]!='\0'){
dest[i]=source[i];
i++;
}
dest[i]='\0';
return 0;
}
它在第一个字符dest[i]=source[i]
行处给出了SIGSEGV, Segmentation Fault
gdb中的SIGSEGV, Segmentation Fault
错误。 我很确定dest[i]
不是字符串文字,因此我应该可以对其进行修改。
我究竟做错了什么?
编辑:这是电话
int main(){
char * str = (char*)malloc((int)sizeof(double));
char * str2 = (char *)malloc((int)sizeof(int));
str = "hello";
str2 = "hey jude";
copyStrings(str2, str);
free(str);
free(str2);
return 0;
}
这是为str2
分配字符串文字-您声称自己没有做的事情。 这实际上是造成段错误的原因。
str2 = "hey jude";
这也导致内存泄漏是在此之前,你malloc
倒是一些内存,并指派它str2
为好。 但是没有足够的内存来容纳字符串。 通常,一个int
是4个字节,您需要9个字节来存储该字符串。
您要执行的操作是,该操作分配与字符串中一样多的字节,再加上一个额外的字节以在末尾存储\\0
终止字符。
str2 = malloc(strlen("hey jude")+1);
strcpy(str2,"hey jude");
或在某些系统上,您可以使用POSIX函数strdup()
在一个便捷的函数调用中有效地完成上述工作。
str2 = strdup("hey jude");
让我们逐行查看它出了什么问题:
int main(){
char * str = (char*)malloc((int)sizeof(double));
char * str2 = (char *)malloc((int)sizeof(int));
str = "hello";
str2 = "hey jude";
copyStrings(str2, str);
free(str);
free(str2);
return 0;
}
int main(){
-这是main
的不正确定义。 应该是int main(int argc, char **argv)
char * str = (char*)malloc((int)sizeof(double));
-定义str
,然后(可能)分配8个字节的内存,并将其地址分配给str
。 malloc
使用size_t
参数,因此size_t
(int)sizeof(double)
不正确。 同样,在C语言中, 绝对不要转换 malloc
的返回值。 所以这行应该是char * str = malloc(sizeof(double));
char * str2 = (char *)malloc((int)sizeof(int));
-所有与上一行相同的问题。 应该是char *str2 = malloc(sizeof(int));
str = "hello";
-导致内存泄漏,因为您刚才在两行分配的内存现在已无法挽回。 您在这里有两个选择-在定义str
时不分配内存或先释放它。 让我们做后者:
free(str);
str = "hello";
str2 = "hey jude";
-同样的问题,类似的解决方案:
free(str2);
str2 = "hey jude";
copyStrings(str2, str);
-在这里,您要告诉您的例程将常量字符串“ hello”复制到常量字符串“ hey jude”的顶部。 这在某些系统上可以正常工作,但在其他系统上则会崩溃。 问题在于常量字符串“ hey jude”的处理。 如果将其存储在可修改的内存中,则代码可以正常工作。 但是,如果将其存储在标记为不可修改的内存中,则会崩溃。 在您的系统上似乎是后者。 要解决此问题,您可能需要返回到上一行并将其更改为
str2 = malloc(20);
这比您所需的内存更多,但可以正常工作。
free(str);
-您试图释放常量字符串“ hello”,该常量不是动态分配的内存。 这需要在赋值str = "hello";
之前完成str = "hello";
。
free(str2;
-与上述相同的问题。这需要在赋值str2 = "hey jude";
。
}
-正确
祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.