【问题标题】:How do I return a string from a function?如何从函数返回字符串?
【发布时间】:2022-10-14 23:28:21
【问题描述】:

通常我用 PHP 开发。但是对于一个项目,我必须用 C 开发一个小程序(在 Windows 上使用 Visual Studio) 为了简化我的代码,我创建了一个返回字符串的函数(该函数比示例中的更复杂)。

最初我有一个警告C4172: returning address of local variable or temporary [duplicate] 我修改了我的功能,不再有这个警告。它有效。 但是代码对吗...?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// Declaration Function
char* getMyString();

//----------------------------//
// Function getMyString()     //
//----------------------------//
char* getMyString()
{
  char* response = NULL;
  response = (char*)malloc(5 * sizeof(char)); if (response == NULL) exit(EXIT_FAILURE);

  strcpy(response, "EFGH");

  return response;
}



//--------------------------------------------------//
//                    Main Program                  //
//--------------------------------------------------//
int main(int nbArg, char** listeArg)
{
  // Initialization
  char* myStringFull = malloc(10 * sizeof(char)); if (myStringFull == NULL) return EXIT_FAILURE;
  char* myString = NULL;

  // Get String with Personnal Function
  myString = getMyString();

  // Finalization
  strcpy(myStringFull, "ABCD");
  strcat(myStringFull, myString);

  // Display
  printf("\n%s\n\n", myStringFull);

  // Free Memory
  free(myStringFull);
  free(myString);

  return(EXIT_SUCCESS);
}

如果上面的代码是正确的,我可以使用下面的代码来进一步简化我的代码......? 如果我可以它是如何在内存中发生的,因为对于最后一个代码,我无法释放函数使用的内存

int main(int nbArg, char** listeArg)
{
  // Initialization
  char* myStringFull = malloc(10 * sizeof(char)); if (myStringFull == NULL) return EXIT_FAILURE;

  // Finalization
  strcpy(myStringFull, "ABCD");
  strcat(myStringFull, getMyString());

  // Display
  printf("\n%s\n\n", myStringFull);

  // Free Memory
  free(myStringFull);


  return(EXIT_SUCCESS);
}

希望我的问题不是太傻,但是 PHP 和 C 之间存在巨大的、巨大的、深不可测的差距 :)

【问题讨论】:

  • 任何你malloc 但不free 的东西都是内存泄漏。在像这样的小程序中,它不会做任何太有问题的事情,因为程序会立即结束(并且内存将被操作系统回收),但在更大、运行时间更长的程序中,它可能会导致问题(例如用完记忆)
  • @UnholySheep - 所以我的第二个代码(仍然更容易阅读)不正确......?我必须通过 malloc() 的变量然后 free() ...?
  • 第二种情况的解决方案是将指针与分配的大小一起传递给函数。然后函数可以根据需要重新分配,然后连接然后返回指针。重新分配的指针可以在没有内存泄漏的情况下被释放。

标签: c string function memory memory-management


【解决方案1】:

你所做的是正确的。但是,您已经注意到这是一项相当多的工作,并且您必须记住之后释放分配的内存。如果可能,我会使用 C++,这样您就可以毫无顾虑地返回 std::string,就像您在 PHP 和许多其他语言中所做的那样。

还有其他函数可以帮助您在 C 中创建字符串。例如,可以通过 POSIX 函数 strdup() 复制字符串。您还可以在 GNU 和 BSD 平台上使用asprintf()

除了分配内存,您还可以打印到缓冲区中。要从函数中执行此操作,您需要将指向缓冲区的指针及其大小传递给该函数。例如:

void getMyString(char *buf, size_t size) {
    snprintf(buf, size, "EFGH");
}

int main(int argc, char *argv[]) {
    char myStringFull[10];
    int pos = snprintf(myStringFull, sizeof myStringFull, "ABCD");
    getMyString(myStringFull + pos, sizeof myStrinfFull - pos);
    printf("%s
", myStringFull);
}

请注意,上面仍然缺少错误检查; snprintf() 的返回值是如果缓冲区足够大时将写入的字符数,或者可能是表示错误的负数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 2016-11-17
    • 1970-01-01
    • 2017-05-12
    • 2011-03-15
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多