我的strcpy中的细分错误

时间:2018-07-18 14:49:53

标签: c string pointers char 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;
}

在第SIGSEGV, Segmentation Fault行的 first 字符处,我在gdb中出现了dest[i]=source[i]错误。我很确定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;
}

2 个答案:

答案 0 :(得分:3)

这是为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");

答案 1 :(得分:-1)

让我们逐行查看它出了什么问题:

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个字节的内存,并将其地址分配给strmalloc接受一个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";之前完成。

free(str2;-与上述相同的问题。这需要在分配str2 = "hey jude";之前完成。

}-正确

好运。