这是我到目前为止所得到的,但我无法弄清楚它有什么问题
void newCopy(char *s)
{
char newString = malloc(sizeof(int * strlen(s)));
newString = s;
return &newString;
}
答案 0 :(得分:4)
void newCopy(char *s)
{
char newString = malloc(sizeof(int * strlen(s)));
第一个和第二个问题在这里。
首先,您将malloc(它是一个指针)的返回值赋给声明为char
的变量。该变量应声明为char*
。
其次,您对sizeof
的输入是错误的。
int * strlen(s)
是无意义的,不会编译,因为你试图将类型和整数相乘。你的意思是sizeof(int)
(这是一个整数)* strlen(s)
(也是一个整数),它将被编译。\0
终止,而strlen不报告是字符串长度的一部分。全部放在一起,sizeof(char)*(strlen(s)+1)
newString = s;
第三个问题在这里。 =
不是魔术运算符 - 它将变量s
(它是一个指针)中的值赋给变量newString
中的值(在修复上述错误之后,它也会是一个指针)。除此之外它什么也没做。
你想要做的是使用strcpy,它是一个函数,它将一个字符串的内容(通过跟随它的指针)复制到另一个字符串的内容(通过跟随它的指针)。 http://www.cplusplus.com/reference/cstring/strcpy/
return &newString;
第四和第五个问题在这里。
第四,你已经将函数声明为void
,在这里你试图返回一个char *。
第五,你试图返回一个指向堆栈上声明的东西的指针(一个局部变量)。一旦函数返回,该函数的堆栈上的任何内容都是垃圾,不能再被引用。
但是,如果你正确地newString
类型char*
,你需要做的就是return newString;
你正确地返回一个指向堆的值的指针(感谢早期的malloc)。
}
最后,通过这段代码来判断,我应该告诉你,C不是一种新手友好的语言,你只需键入“看起来像你想要发生的事情并祈祷它有效”。如果你甚至有点错误,你的代码就会崩溃,你就不知道为什么,因为你不知道正确的做事方式。要么读一本关于C的非常好的书,要一步一步地教自己从基础到高级的所有内容,这样你才能知道它是如何工作的,或者选择一种更加用户友好的语言。
答案 1 :(得分:1)
我首先应该指出,在我看来,考虑到此代码中错误的数量和(特别)性质,您可能需要get a good book on C。
您的newString = s;
会覆盖指针而不是将字符串复制到刚刚分配的空间中。因此,您丢失指向您刚刚分配的内容(泄漏内存)而不进行复制。您可能希望使用strcpy
而不是直接分配。
您分配的大小的计算也不是您真正想要的。通常,对于长度为N的字符串,您希望分配N + 1个字节。您当前正在尝试分配sizeof(int * strlen(s))
个字节,甚至不应该编译。
答案 2 :(得分:0)
更正后的版本应该是:
char *newCopy(char *s)
{
if (s == NULL)
return NULL;
char *newString = malloc(strlen(s) + 1);
if (newString == NULL)
return NULL;
strcpy(newString, s);
return newString;
}