【问题标题】:Using malloc to allocate memory for a string (c++ source)使用 malloc 为字符串分配内存(c++ 源码)
【发布时间】:2012-01-13 07:43:27
【问题描述】:

我正在尝试创建一个结构数组,我已经完成了,我必须接收来自用户的输入。第一条数据是描述(一个字符串)。我也必须为它分配内存。我不是要检查的字符串有多大,但我认为我没有正确设置它。谁能给我一个提示或我可以查看的页面来弄清楚吗?

非常感谢。以下是重要的代码片段:

struct myExpenses
{
    char *description;
    float cost;
};


int main (void)
{


struct myExpenses *pData = NULL;
struct myExpenses expenses[60];
int exit=0;
int i = 0;
char buffer[81] = "";


printf("Please enter all your descriptions:\n");
for (i=0;i < 60; i++)
{
    fgets(buffer,stdin);
    expenses[i].description=(char *)malloc sizeof(buffer);

} 

【问题讨论】:

  • 您已将此标记为C++,但它看起来像普通的C 代码?
  • 因为这是专门针对 C++ 而不是 C,您是否有理由使用 char[]s 而不是 std::strings?
  • 抱歉,这是一门 C++ 课程,所以我有点自动驾驶。 @AusCbloke:我不明白你指的是什么。
  • 不要对 malloc 和 AFAIK fgets 的返回值进行类型转换,采用 3 个参数
  • fgets 的电话会在你的脸上炸开。 maxlen 参数在哪里?

标签: c windows malloc


【解决方案1】:

您可以使用 strdup 代替 malloc(),它会自动为您分配正确大小的缓冲区。

expenses[i].description = strdup( buffer );

【讨论】:

  • 哇。谢谢,这行得通!但是如果我选择使用 malloc 会是什么样子呢?
  • 那就是:费用[i].description = (char*) malloc(strlen(buffer) + 1); strcpy(费用[i].description, buffer);
  • 标准 C 中没有 strdup - 您可能必须自己编写:stackoverflow.com/questions/252782/strdup-what-does-it-do-in-c/…
  • @PaulMitchell:最好不要在 C 中对 malloc 的返回值进行类型转换,而且它也不能保证你的内存被初始化为 0,所以也许calloc?
  • 感谢另一个.anon.coward。 OP询问如何使用malloc完成。顺便说一句,为什么要将内存初始化为零?
【解决方案2】:

除了您在malloc 调用周围缺少一对括号并且没有真正说明问题所在之外,您只需分配内存而不复制字符串。它可以在一个函数调用中完成,而不是使用strdup 函数:

printf("Please enter all your descriptions:\n");
for (i=0;i < 60; i++)
{
    fgets(buffer,stdin);
    expenses[i].description=strdup(buffer);
}

请记住在完成所有描述后调用free,否则会出现内存泄漏。

编辑如何在给定示例中使用free

for (i = 0; i < 60; i++)
    free(expenses[i].description);

【讨论】:

  • 如何拨打免费电话?我知道这是 free() 函数(我相信),但我不知道如何使用它。
  • @Robsta 只是使用由malloccalloc 分配的指针或使用这些分配函数的函数调用free,例如strdup:free(pointer);。请参阅我的更新答案。
  • 也非常感谢,感谢您的帮助和时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2015-11-09
  • 1970-01-01
  • 2012-10-10
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多