0

我有以下方法签名:

int get_name(char* &name_out);

我想做的是分配大小为namefor的内存,name_out然后将内容复制namename_out.

或者将其更改为:

int get_name(char &name_out[], int size);

并允许函数的用户首先分配和跟踪内存,如果给定数组的大小不足以包含字符串,则返回错误?

我唯一不喜欢的是它需要get_name()函数的用户了解名称字符串的长度。

我觉得有两个功能int get_name_length();get_name(char* name_out);

由于这是编程作业的一部分,因此有规定:

  1. 不允许使用字符串类。
  2. 必须使用 C 风格的字符串。
  3. 不能使用向量。
  4. 该函数必须返回一个 int 来指示错误。
  5. 不允许异常处理。

谢谢你。

4

2 回答 2

1

如果我理解正确,您要做的是为“strcpy”实现一个变体。

主要区别在于您将分配责任传递给您的复制功能,而“strcpy”则将其留给用户。如果这是一个生产代码,那么我建议遵循行业习惯的“strcpy”方法。

如果它只是为了玩,那么用一个执行分配的函数包装 strcpy 并坚持 strcpy 的接口。

于 2015-01-29T06:27:31.537 回答
0

执行此操作的标准 C 方法是将两个指针传递给函数:

int getName(char** name_out, size_t* size_out);

这有几个优点:

  • 调用者可以自由地预分配内存/重用分配。

  • realloc()被调用者可以通过(假设 C 风格的字符串是用 分配的malloc())或一对delete[]/来自由调整分配new[]

  • 地址采用是明确的。即在呼叫站点,您将编写:

    char* name = null_ptr;
    size_t size = 0;
    if(getName(&name, &size)) handleError();
    

    显式&运算符非常清楚地表明该函数getName()可以更改这两个变量。如果您使用引用,则如果不查看函数声明,则无法区分按引用调用和按值调用。

另请注意,用于分配大小size_t的类型是:它是保证能够容纳整个可用地址空间大小的类型。

于 2015-01-29T06:27:44.450 回答