这是我到目前为止所拥有的,但我无法弄清楚它有什么问题
void newCopy(char *s)
{
char newString = malloc(sizeof(int * strlen(s)));
newString = s;
return &newString;
}
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
type char*
,您需要做的就是return newString;
正确地按值返回一个指向堆的指针(感谢早期的 malloc)。
}
最后,从这段代码来看,我应该告诉你,C 不是一种对新手友好的语言,你可以在其中键入“看起来”你想要发生的事情并祈祷它有效。如果你稍微有一点错误,你的代码就会崩溃,你会零知道为什么,因为你不知道做事的正确方法。要么阅读一本非常好的 C 书,然后一步一步地自学从基础到高级的所有内容,这样你就知道它是如何工作的,或者选择一门对用户更友好的语言。
我应该首先指出,在我看来,鉴于此代码中错误的数量和(尤其是)性质,您可能需要一本关于 C 的好书。
您newString = s;
会覆盖指针,而不是将字符串复制到刚刚分配的空间中。因此,您丢失了指向您刚刚分配的内容(泄漏内存)的指针,而没有制作副本。您可能想使用strcpy
而不是直接分配。
您对分配大小的计算也不是您真正想要的。通常,对于长度为 N 的字符串,您希望分配 N+1 个字节。您当前正在尝试分配sizeof(int * strlen(s))
字节,甚至不应该编译。
一个更正的版本应该是这样的:
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;
}