编写一个函数来动态创建一个新的字符串副本并返回一个指向新副本的指针(C)

时间:2013-06-05 01:28:55

标签: c function dynamic

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

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

3 个答案:

答案 0 :(得分: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中的字符串需要由额外的\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;
}