为什么c指针在这里不起作用?

时间:2013-03-28 15:11:26

标签: c malloc

我是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;
}

由于

5 个答案:

答案 0 :(得分:4)

您的buffer = (char *) malloc(i+1);在此功能之外无效。实际上,该函数正在更改其自己的buffer副本,并且调用者(main)从未看到此更改。这在C FAQ中已得到很好的解释。

不是将它作为参数传递,而是可以返回缓冲区,因为此函数暂时不返回任何内容:

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

/* ... */

char * buffer = f(5); 

  • 在C演员中malloc是不必要的,通常被认为是 可疑的做法
  • ni变量名称有些误导:人们希望它们反过来
  • f不是函数的广告名称

答案 1 :(得分: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);

答案 2 :(得分:1)

变量按值传递给函数。

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

解决此问题的不同方法:

f返回指针,并将其保存在buffer的{​​{1}}中:

main

或者将指针传递给指向char * f(int i) { char * buffer = malloc(i + 1); /* ... */ return buffer; } int main() { char * buffer = f(5); /* ... */ return 0; } 的指针;在f中,传递main的地址:

buffer

答案 3 :(得分:0)

您无法更改按值传递的变量的原始值。

如果你想在一个函数中使用malloc,并在一个变量中返回malloc的结果,那么该变量必须是通过引用传递

E.g。而不是:

void f(char * buffer, int i);

应该是:

void f(char **buffer, int i);

答案 4 :(得分:0)

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

MALLOC:

不要投射malloc(这是一个有趣的话题:Do I cast the result of malloc?)。

FOR LOOP:

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

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

此致