如何制作字符串的副本并返回其地址,将其分配给指针并在C中打印新字符串?

时间:2014-01-27 08:49:12

标签: c arrays string pointers malloc

我正在编写一个获取字符串的函数,在堆上分配足以创建副本的内存,创建副本并返回新副本开头的地址。 在主要我希望能够打印新副本,然后使用free()来释放内存。我认为实际的功能是有效的,虽然我不是char指针必须是静态的,还是它?

main中的代码不能正常工作......

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int make_copy(char arr[]);

int main()
{
    char arrr[]={'a','b','c','d','e','f','\0'};

    char *ptr;
    ptr=make_copy(arrr);

    printf("%s",ptr);
    getchar();

    return 0;
}


int make_copy(char arr[])
{
    static char *str_ptr;
    str_ptr=(char*)malloc(sizeof(arr));

    int i=0;
    for(;i<sizeof str_ptr/sizeof(char);i++)
        str_ptr[i]=arr[i];

    return (int)str_ptr;
}

好的,基于评论。修订版:

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>

char* make_copy(char arr[]);

int main()
{
    char arrr[]={"abcdef\0"};

    char *ptr=make_copy(arrr);

    printf("%s",ptr);
    getchar();

    return 0;
}


char* make_copy(char arr[])
{
    static char *str_ptr;
    str_ptr=(char*)malloc(strlen(arr)+1);

    int i=0;
    for(;i<strlen(arr)+1;i++)
        str_ptr[i]=arr[i];

    return str_ptr;
}

甚至更好:

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char* make_copy(char arr[]);

int main()
{
    char arrr[]={"abcdef\0"};

    printf("%s",make_copy(arrr));
    getchar();

    return 0;
}


char* make_copy(char arr[])
{
    char *str_ptr;
    str_ptr=(char*)malloc(strlen(arr)+1);
    return strcpy(str_ptr,arr);
}

5 个答案:

答案 0 :(得分:2)

您走在正确的轨道上,但您的代码存在一些问题:

  1. 当您的意思是int时,请勿使用char *。那是错的。
  2. 定义字符串时不要列出字符,请写char arrr[] = "abcdef";
  3. 不要按sizeof (char)缩放字符串alloations;这总是1,所以没有意义。
  4. 请勿重新实施strcpy()复制字符串。
  5. Don't cast the return value of malloc() in C.
  6. 不要无缘无故地制作局部变量static
  7. 不要在传递给函数的数组上使用sizeof;它不起作用。您必须使用strlen()
  8. 不要省略字符串终止符的空格,必须在字符串长度上加1。
  9. 更新您的第三次尝试越来越近了。 :)这是我写的方式:

    char * make_copy(const char *s)
    {
      if(s != NULL)
      {
        const size_t size = strlen(s) + 1;
        char *d = malloc(size);
        if(d != NULL)
          strcpy(d, s);
        return d;
      }
      return NULL;
    }
    

    这样可以正常处理NULL参数,并在使用内存之前检查内存分配是否成功。

答案 1 :(得分:0)

sizeof(arr)不会给出确切的大小。如果要计算数组大小,请将数组的长度传递给函数。

当将数组传递给函数时它会衰减到指针,我们无法使用指针找到数组大小。

答案 2 :(得分:0)

首先,请勿使用sizeofmake_copy中确定字符串的大小,使用strlen

其次,为什么要将指针(char*)转换为整数? char*已经是指针(内存地址),如果你printf("address: %x\n", ptr);,你可以看到。

答案 3 :(得分:0)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *strdup(const char *str)
{
    char *s = (char*)malloc(strlen(str)+1);
    if (s == NULL) return NULL;
    return strcpy(s, str);
}

int main()
{
    char *s = strdup("hello world");
    puts(s);
    free(s);
}

答案 4 :(得分:-1)

点 〜在int内部返回char *。 〜你可以使用下面的行释放内存

 if(make_copy!=NULL)
  free(make_copy)

以下是修改后的代码。

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
char* make_copy(char arr[]);

int main()
{
    char arrr[]={'a','b','c','d','e','f','\0'};

    char *ptr;
    ptr=make_copy(arrr,sizeof(arrr)/sizeof(char));

    printf("%s",ptr);
    printf("%p\n %p",ptr,arrr);
    getchar();

    return 0;
}


char* make_copy(char arr[],int size)
{
     char *str_ptr=NULL;
    str_ptr=(char*)malloc(size+1);

    int i=0;
    for(;i<size;i++)
        str_ptr[i]=arr[i];
       str_ptr[i]=0;

    return str_ptr;
}