0

我是 C 语言的初学者,我不能很好理解的是 malloc 的使用。所以我决定创建这个例子。我想了解为什么它不打印出缓冲区数据以及执行此操作的最佳做​​法是什么。

#include <stdio.h>      /* printf, scanf, NULL */
#include <stdlib.h>     /* malloc, free, rand */

void f(char * buffer, int i) {
  buffer = (char *) malloc(i+1);
  if (buffer==NULL) 
    exit (1);

  for (int n=0; n<i; n++)
    buffer[n]=rand()%26+'a';

  buffer[i]='\0';
}

int main ()
{
  char * buffer;
  f(buffer, 5);
  printf ("Random string: %s\n",buffer);
  free (buffer);

  return 0;
}

谢谢

4

5 回答 5

4

buffer = (char *) malloc(i+1);在函数之外没有任何影响。实际上,该函数正在更改它自己的 副本buffer,而调用者 ( main) 永远不会看到此更改。这在C FAQ中有很好的解释。

您可以返回缓冲区,而不是将其作为参数传递,因为该函数目前不返回任何内容:

char *f(int i)
    /* ... */
    return buffer;

/* ... */

char * buffer = f(5); 

  • 在 C 中强制转换malloc是不必要的,通常被认为是可疑的做法
  • 和变量名称有些误导:人们期望它们n反过来i
  • f不是函数的好名字
于 2013-03-28T15:13:22.373 回答
2

为了修改传递给函数的指针,您必须使用指向指针的指针:

void f(char** buffer, int i) {
  *buffer = malloc(i+1);
  if (*buffer==NULL) 
    exit (1);

  for (int n=0; n<i; n++)
    (*buffer)[n]=rand()%26+'a';

  (*buffer)[i]='\0';
}

用法:

char* buff;

f(&buff, len);
于 2013-03-28T15:15:31.113 回答
1

变量按值传递给函数。

当您调用时f(buffer, 5),它不会将变量传递buffer给函数f;它只复制变量的值buffer。在 functionf中,创建了一个名为buffer(参数变量)的新变量。当您更改该变量的值时,您传入的原始变量main不受影响。

解决此问题的不同方法:

使f返回指针,并将其保存buffermain

char * f(int i) {
    char * buffer = malloc(i + 1);

    /* ... */

    return buffer;
}

int main() {
    char * buffer = f(5);

    /* ... */

    return 0;
}

或者传递一个指向f;的指针。在 中main,传递 的地址buffer

void f(char ** buffer, int i) {
    *buffer = malloc(i + 1);

    /* ... */
}

int main() {
    char * buffer;
    f(&buffer, 5);

    /* ... */

    return 0;
}        
于 2013-03-28T15:18:16.937 回答
0

您不能更改按值传递的变量的原始值

如果要在函数中进行 malloc,并在变量中返回 malloc 的结果,则该变量必须通过引用传递

例如,而不是:

void f(char * buffer, int i);

它应该是:

void f(char **buffer, int i);
于 2013-03-28T15:19:07.480 回答
0

CNICUTAR 是对的,但这里有一些有趣的信息:

马洛克:

不要强制转换 malloc(这里有一个有趣的话题:我会转换 malloc 的结果吗?)。

循环:

对于 for 循环,您应该使用这种方式(C89 版本):

int i;
for (i = 0; ...)

问候,

于 2013-03-28T15:19:26.483 回答