c - 如何在 C 中复制字符串并返回其地址,将其分配给指针并打印新字符串?

标签 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);
}

最佳答案

您的方向是正确的,但您的代码存在一些问题:

  1. 当您指的是 char * 时,请勿使用 int。这是错误的。
  2. 定义字符串时不要列出字符,写成char arrr[] = "abcdef";
  3. 不要按 sizeof (char) 缩放字符串分配;它总是 1,所以毫无意义。
  4. 不要重新实现 strcpy() 来复制字符串。
  5. Don't cast the return value of malloc() in C.
  6. 不要无缘无故地将局部变量设为静态
  7. 不要在传递给函数的数组上使用sizeof;它不起作用。您必须使用strlen()
  8. 不要省略字符串终止符的空格,字符串的长度必须加 1。

更新您的第三次尝试越来越近了。 :) 这是我的写法:

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 参数,并在使用内存之前检查内存分配是否成功。

关于c - 如何在 C 中复制字符串并返回其地址,将其分配给指针并打印新字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21376410/

相关文章:

c++ - JCuda全局共享内存导致错误

java - Java中数组初始值设定项中带有尾随逗号的数组

java - 为什么这个 Java 二维数组不抛出 IndexOutOfBoundException?

c# - 删除不是 ASCII 32 到 175 C# 的字符的更好方法

javascript - 如何将复杂的 JavaScript 对象转换为字符串并返回

c - C 中一个枚举最多可以包含多少个元素?

c - 在 C 中释放多维数组

c - 是否可以通过IPC消息传递队列发送信号?

javascript - 如何设置一个按钮来执行for循环?

c++ - 字符串数据的哈希函数