-2

这是我到目前为止所拥有的,但我无法弄清楚它有什么问题

void newCopy(char *s)
{
  char newString = malloc(sizeof(int * strlen(s)));
  newString = s;
  return &newString;
}
4

3 回答 3

4
void newCopy(char *s)
{
  char newString = malloc(sizeof(int * strlen(s)));

第一个和第二个问题在这里。

首先是,您将作为指针的 malloc 的返回值分配给声明为char. 该变量应声明为char*.

其次,你的输入sizeof是错误的。

  • int * strlen(s)是胡说八道,不会编译,因为你试图将一个类型和一个整数相乘。你的意思是sizeof(int)(它是一个整数)* strlen(s)(也是一个整数),它将编译。
  • 您应该使用 sizeof(char) 而不是 sizeof(int),因为它是一个字符串。
  • 您应该将大小加 1,因为 C 中的字符串需要以 null 结尾,由\0strlen 不报告为字符串长度的一部分的额外字符终止。

把这一切放在一起,sizeof(char)*(strlen(s)+1)

  newString = s;

第三个问题就在这里。=不是魔术运算符 - 它将变量中的值s(它是一个指针)分配给变量中的值newString(在修复上述错误之后,它也将是一个指针)。除此之外,它什么也不做。

您想要做的是使用 strcpy,它是一个将一个字符串的内容(通过跟随其指针)复制到另一个字符串的内容(通过跟随其指针)的函数。http://www.cplusplus.com/reference/cstring/strcpy/

  return &newString;

第四和第五个问题在这里。

第四是,您已将函数声明为void,在这里您试图返回一个 char*。

第五,你试图返回一个指向在堆栈上声明的东西(一个局部变量)的指针。一旦函数返回,该函数堆栈上的任何东西都是垃圾,不能再被引用。

但是,如果您正确地使用newStringtype char*,您需要做的就是return newString;正确地按值返回一个指向堆的指针(感谢早期的 malloc)。

}

最后,从这段代码来看,我应该告诉你,C 不是一种对新手友好的语言,你可以在其中键入“看起来”你想要发生的事情并祈祷它有效。如果你稍微有一点错误,你的代码就会崩溃,你会零知道为什么,因为你不知道做事的正确方法。要么阅读一本非常好的 C 书,然后一步一步地自学从基础到高级的所有内容,这样你就知道它是如何工作的,或者选择一门对用户更友好的语言。

于 2013-06-05T01:34:01.233 回答
1

我应该首先指出,在我看来,鉴于此代码中错误的数量和(尤其是)性质,您可能需要一本关于 C 的好书

newString = s;会覆盖指针,而不是将字符串复制到刚刚分配的空间中。因此,您丢失了指向您刚刚分配的内容(泄漏内存)的指针,而没有制作副本。您可能想使用strcpy而不是直接分配。

您对分配大小的计算也不是您真正想要的。通常,对于长度为 N 的字符串,您希望分配 N+1 个字节。您当前正在尝试分配sizeof(int * strlen(s))字节,甚至不应该编译。

于 2013-06-05T01:33:53.043 回答
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;
}
于 2013-06-05T01:36:26.477 回答