接收指向 C 风格字符串的指针作为参数并能够分配内存或修改它的正确方法是什么?
What is the correct way to receive a pointer to a C-style string as an argument and be able to allocate memory or modify it?
我有以下方法签名:
int get_name(char* &name_out);
我想做的是为 name_out
分配 name
大小的内存,然后将 name
的内容复制到 name_out
.
或者将其更改为更好:
int get_name(char &name_out[], int size);
并允许函数的用户首先分配和跟踪内存,并且 return 如果给定数组的大小不足以包含字符串,则会出现错误?
我唯一不喜欢的是它要求 get_name()
函数的用户了解名称字符串的长度。
我觉得有两个函数 int get_name_length();
和 get_name(char* name_out);
是多余的
由于这是一个程序作业,所以有规定:
- 不允许使用字符串 class。
- 必须使用 C 风格的字符串。
- 无法使用矢量。
- 该函数必须 return 一个 int 来指示错误。
- 不允许异常处理。
谢谢。
如果我理解正确的话,你想做的是为 'strcpy'.
实现一个变体
主要区别在于您将分配责任传递给复制函数,而 'strcpy' 则将其留给用户。如果这是生产代码,那么我建议遵循行业习惯的 'strcpy' 方法。
如果它只是为了玩,那么用一个函数包装 strcpy 进行分配并坚持 strcpy 的接口。
执行此操作的标准 C 方法是将两个指针传递给函数:
int getName(char** name_out, size_t* size_out);
这有几个优点:
调用者可以自由预分配memory/reuse一个分配。
被调用者可以通过realloc()
(假设C风格字符串分配malloc()
)或一对[=14]自由调整分配=]/new[]
.
地址获取是显式的。 IE。在呼叫站点你会写:
char* name = null_ptr;
size_t size = 0;
if(getName(&name, &size)) handleError();
显式 &
运算符非常清楚地表明函数 getName()
可以更改两个变量。如果使用引用,不看函数声明就无法区分引用调用和值调用。
另请注意,用于分配大小的类型是size_t
:保证能够容纳整个可用地址大小的类型space。
我有以下方法签名:
int get_name(char* &name_out);
我想做的是为 name_out
分配 name
大小的内存,然后将 name
的内容复制到 name_out
.
或者将其更改为更好:
int get_name(char &name_out[], int size);
并允许函数的用户首先分配和跟踪内存,并且 return 如果给定数组的大小不足以包含字符串,则会出现错误?
我唯一不喜欢的是它要求 get_name()
函数的用户了解名称字符串的长度。
我觉得有两个函数 int get_name_length();
和 get_name(char* name_out);
由于这是一个程序作业,所以有规定:
- 不允许使用字符串 class。
- 必须使用 C 风格的字符串。
- 无法使用矢量。
- 该函数必须 return 一个 int 来指示错误。
- 不允许异常处理。
谢谢。
如果我理解正确的话,你想做的是为 'strcpy'.
实现一个变体主要区别在于您将分配责任传递给复制函数,而 'strcpy' 则将其留给用户。如果这是生产代码,那么我建议遵循行业习惯的 'strcpy' 方法。
如果它只是为了玩,那么用一个函数包装 strcpy 进行分配并坚持 strcpy 的接口。
执行此操作的标准 C 方法是将两个指针传递给函数:
int getName(char** name_out, size_t* size_out);
这有几个优点:
调用者可以自由预分配memory/reuse一个分配。
被调用者可以通过
realloc()
(假设C风格字符串分配malloc()
)或一对[=14]自由调整分配=]/new[]
.地址获取是显式的。 IE。在呼叫站点你会写:
char* name = null_ptr; size_t size = 0; if(getName(&name, &size)) handleError();
显式
&
运算符非常清楚地表明函数getName()
可以更改两个变量。如果使用引用,不看函数声明就无法区分引用调用和值调用。
另请注意,用于分配大小的类型是size_t
:保证能够容纳整个可用地址大小的类型space。