【发布时间】:2018-12-26 13:15:27
【问题描述】:
我正在编写自己的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;
}
它在 gdb 中给我 SIGSEGV, Segmentation Fault 错误,在 dest[i]=source[i] 行,就在 first 字符处。我很确定 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;
}
【问题讨论】:
-
显示来电者。顺便说一句,它应该返回一些有意义的东西。
-
strcpy()只接受const char *有什么问题?您可以将非 constchar *传递给函数,该函数只是承诺它不会通过const char *更改数据。它没有害处;您可以将 const 或非 const 字符串作为第二个参数传递。 -
int和double的大小与字符串有什么关系?之后,您还可以为它们分配字符串文字。 -
由于
malloc()需要size_t参数,您的(int)对sizeof的结果的强制转换是奇数。字符串"hey jude"有 9 个字节长;在大多数机器上,sizeof(double)是8(而sizeof(int)通常是4)。这可能是麻烦的原因。您正在泄漏内存;而你 ARE 试图分配给常量(字符串文字)。您需要使用strcpy()来分配"hello"和"hey jude"— 并且您需要确保有足够的空间将字符串复制到其中。提示:您没有分配足够的空间。将您的sizeof()操作数更改为16。使用strcpy()复制。 -
否:
const char *参数说“我,strcpy(),保证不会尝试修改作为我的第二个参数传递的字符串;我会读它,但我不会写信给它”。
标签: c string pointers char strcpy