【问题标题】:Malloc in C - return valueC中的Malloc - 返回值
【发布时间】:2017-03-23 22:06:24
【问题描述】:

我有这个代码示例,并且大致了解它的逻辑,但我陷入了一些细节。

#define LSH_RL_BUFSIZE 1024
char *lsh_read_line(void) {
  int bufsize = LSH_RL_BUFSIZE;
  int position = 0;
  char *buffer = malloc(sizeof(char) * bufsize);
  int c;

  if (!buffer) {
    fprintf(stderr, "lsh: allocation error\n");
    exit(EXIT_FAILURE);
  }

  while (1) {
    // Read a character
    c = getchar();

    // If we hit EOF, replace it with a null character and return.
    if (c == EOF || c == '\n') {
      buffer[position] = '\0';
      return buffer;
    } else {
      buffer[position] = c;
    }
    position++;

    // If we have exceeded the buffer, reallocate.
    if (position >= bufsize) {
      bufsize += LSH_RL_BUFSIZE;
      buffer = realloc(buffer, bufsize);
      if (!buffer) {
        fprintf(stderr, "lsh: allocation error\n");
        exit(EXIT_FAILURE);
      }
    }
  }
}

我无法理解两件事:首先,这条线到底是做什么的?

char *buffer = malloc(sizeof(char) * bufsize)

其次,下一行是如何工作的?指针是怎么返回的?

return buffer;

【问题讨论】:

  • "我们如何返回一个指针?"只需使用可以返回整数的方式。你有什么理由认为你不能这样做?
  • malloc 向操作系统请求由其参数指定的一块内存(在本例中为bufsize)。您可以像从函数中返回任何其他值一样返回一个指针,其详细信息取决于 ABI
  • 我的意思是,在这个例子中它给了我们什么实用性?
  • return buffer; 返回指向 malloced 的内存的指针
  • 请注意,old_ptr = realloc(old_ptr, new_size) 是一种反模式。如果内存分配失败,old_ptr 中有一个空指针,但它曾经(但不再)指向的内存仍分配给程序。你可以使用new_ptr = realloc(old_ptr, new_size); if (new_ptr == 0) { …handle error… } old_ptr = new_ptr; 来防止内存泄漏。

标签: c function pointers return


【解决方案1】:

这条线到底是做什么的?

malloc 表示“内存分配” malloc 函数用于动态创建内存块,它分配大小以字节为单位的内存块(作为参数)。它返回一个指向该块开头的指针。

所以这里指定的大小是“sizeof(char) * bufsize”,即请求长度为“bufsize”的字符块。要获得 1 个字符的大小,请使用运算符 sizeof(sizeof 是运算符而不是函数)

以下行如何工作?

函数lsh_read_line返回一个指向内存块的指针,这里是malloc分配的内存——也就是buffer

指针如何返回?

因为它是来自堆的动态内存 - 即使在函数返回后它也是有效的内存块。

附带说明 - 'lsh_read_line' 调用者必须释放此 buffer 否则会出现内存泄漏!

关于C函数栈的更多细节请参考https://en.wikipedia.org/wiki/Call_stack

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多