我正在编写一个函数,它获取一个字符串,在堆上分配足以创建副本的内存,创建副本并返回新副本的开头地址。 主要是我希望能够打印新副本,然后使用 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);
}
最佳答案
您的方向是正确的,但您的代码存在一些问题:
- 当您指的是
char *
时,请勿使用int
。这是错误的。 - 定义字符串时不要列出字符,写成
char arrr[] = "abcdef";
- 不要按
sizeof (char) 缩放字符串分配
;它总是 1,所以毫无意义。 - 不要重新实现
strcpy()
来复制字符串。 - Don't cast the return value of
malloc()
in C. - 不要无缘无故地将局部变量设为
静态
。 - 不要在传递给函数的数组上使用
sizeof
;它不起作用。您必须使用strlen()
。 - 不要省略字符串终止符的空格,字符串的长度必须加 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/