我正在编写一个获取字符串的函数,在堆上分配足以创建副本的内存,创建副本并返回新副本开头的地址。 在主要我希望能够打印新副本,然后使用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);
}
答案 0 :(得分:2)
您走在正确的轨道上,但您的代码存在一些问题:
int
时,请勿使用char *
。那是错的。char arrr[] = "abcdef";
sizeof (char)
缩放字符串alloations;这总是1,所以没有意义。strcpy()
复制字符串。malloc()
in C. static
。sizeof
;它不起作用。您必须使用strlen()
。更新您的第三次尝试越来越近了。 :)这是我写的方式:
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)
首先,请勿使用sizeof
在make_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;
}