子函数内的 malloc、free 和 memmove
malloc, free, and memmove inside a subfunction
我想使用一个子函数来复制一个字符数组。是这样的:
void NSV_String_Copy (char *Source, char *Destination)
{
int len = strlen(Source);
if (*Destination != NULL)
free(Destination);
Destination = malloc(len + 1);
memmove(*Destination, Source, len);
Destination[len] = '[=10=]'; //null terminate
}
那样的话,我可以从主函数中调用它,然后这样执行操作:
char *MySource = "abcd";
char *MyDestination;
NSV_String_Copy (MySource, MyDestination);
但是,它没有按预期工作。请帮助!
C 按值传递参数,这意味着您无法使用问题中的函数原型更改调用者的 MyDestination
。这里有两种方法可以更新调用者的 MyDestination
.
副本
选项 a) 传递 MyDestination
的地址
void NSV_String_Copy (char *Source, char **Destination)
{
int len = strlen(Source);
if (*Destination != NULL)
free(*Destination);
*Destination = malloc(len + 1);
memmove(*Destination, Source, len);
(*Destination)[len] = '[=10=]'; //null terminate
}
int main( void )
{
char *MySource = "abcd";
char *MyDestination = NULL;
NSV_String_Copy(MySource, &MyDestination);
printf("%s\n", MyDestination);
}
选项 b) return Destination
来自函数,并将其分配给 MyDestination
char *NSV_String_Copy (char *Source, char *Destination)
{
if (Destination != NULL)
free(Destination);
int len = strlen(Source);
Destination = malloc(len + 1);
memmove(Destination, Source, len);
Destination[len] = '[=11=]'; //null terminate
return Destination;
}
int main( void )
{
char *MySource = "abcd";
char *MyDestination = NULL;
MyDestination = NSV_String_Copy(MySource, MyDestination);
printf("%s\n", MyDestination);
}
我想使用一个子函数来复制一个字符数组。是这样的:
void NSV_String_Copy (char *Source, char *Destination)
{
int len = strlen(Source);
if (*Destination != NULL)
free(Destination);
Destination = malloc(len + 1);
memmove(*Destination, Source, len);
Destination[len] = '[=10=]'; //null terminate
}
那样的话,我可以从主函数中调用它,然后这样执行操作:
char *MySource = "abcd";
char *MyDestination;
NSV_String_Copy (MySource, MyDestination);
但是,它没有按预期工作。请帮助!
C 按值传递参数,这意味着您无法使用问题中的函数原型更改调用者的 MyDestination
。这里有两种方法可以更新调用者的 MyDestination
.
选项 a) 传递 MyDestination
void NSV_String_Copy (char *Source, char **Destination)
{
int len = strlen(Source);
if (*Destination != NULL)
free(*Destination);
*Destination = malloc(len + 1);
memmove(*Destination, Source, len);
(*Destination)[len] = '[=10=]'; //null terminate
}
int main( void )
{
char *MySource = "abcd";
char *MyDestination = NULL;
NSV_String_Copy(MySource, &MyDestination);
printf("%s\n", MyDestination);
}
选项 b) return Destination
来自函数,并将其分配给 MyDestination
char *NSV_String_Copy (char *Source, char *Destination)
{
if (Destination != NULL)
free(Destination);
int len = strlen(Source);
Destination = malloc(len + 1);
memmove(Destination, Source, len);
Destination[len] = '[=11=]'; //null terminate
return Destination;
}
int main( void )
{
char *MySource = "abcd";
char *MyDestination = NULL;
MyDestination = NSV_String_Copy(MySource, MyDestination);
printf("%s\n", MyDestination);
}