【问题标题】:Appending to string as input argument附加到字符串作为输入参数
【发布时间】:2018-04-13 23:41:21
【问题描述】:

我无法在 C 例程中生成字符串。

目标

  • 让函数生成自定义字符串并返回值
  • 例如'void getName(char ** name)'

尝试

int main(void) {
    char *name;
    getName(&name);
}

void getName(char **name) {
    *name = "#";                    // Load with prefix
    //?strcpy(*name[1], "123");     // Goal: "#123"
}

我怎样才能让getName() 生成#123 如此处所示?

【问题讨论】:

  • 显然,您必须在某处为您的字符串分配内存(并在其他地方释放内存)?
  • 可能是范围原因,我应该将变量设为全局吗?分配是有道理的,会试试这个谢谢
  • 你还没有初始化name

标签: c string strcpy


【解决方案1】:

第一个问题:使用malloc分配内存。

char *name = malloc(sizeof("#123")+1);

即使你在分配内存后运行它,它也会给出运行时错误;正如你正在做的那样:

*name = "#";

问题是首先您为 5 个字符分配空间并将指针指向该内存的开头。然后在第二行中,将指针指向导致内存泄漏的字符串文字。

指针不再指向分配的内存。

你会喜欢这样做:

int main(void) {
    char *name = malloc(sizeof("#123")+1);
    getName(&name);
    printf("%s", name);
    free(name);
    name = NULL;
}

void getName(char **name) {
   strcpy((*name), "#");
   strcat(*name,"123");
}

【讨论】:

  • 嗯,在现实生活中的应用程序中,必须以某种方式确保他分配足够的内存......所以可能应该在 getName 内完成分配,以便您可以计算实际所需的大小......或者,你可以有一个参数来告诉分配的大小......在所有情况下,你应该释放内存。
  • 现在可以了吗?
  • 好吧,如果 getName 总是返回一个由 4 个字符 + '\0' 组成的字符串,那么是的,它会起作用......但是如果在某些时候修改代码以返回更长的字符串,它就会很脆弱。 .. 在玩具程序中,这并不是真正的问题,但在大型应用程序中,可能很难确保为每个调用者更新分配的大小。
  • 我们需要为这些情况添加 realloc
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 2013-05-11
  • 2013-01-19
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多