繁体   English   中英

我的strcpy中的细分错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM