由于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;
}
答案 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个字节的内存,并将其地址分配给str
。 malloc
接受一个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";
之前完成。
}
-正确
好运。