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



我是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]='';
}
int main ()
{
  char * buffer;
  f(buffer, 5);
  printf ("Random string: %sn",buffer);
  free (buffer);
  return 0;
}

谢谢

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

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

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

  • 在C中,malloc是不必要的,通常被认为是一种可疑的练习
  • ni变量名有点误导人:人们期望它们以另一种方式出现
  • f不是函数的好名字

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

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]='';
}

用法:

char* buff;
f(&buff, len);

变量通过value传递给函数。

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

不同的解决方法:

使f返回指针,并将buffer保存在main中:

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

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

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

。而不是:

void f(char * buffer, int i);

应该是:

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

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

MALLOC:

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

FOR LOOP:

对于For循环,您应该这样使用(C89版本):

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

认为,

相关内容

  • 没有找到相关文章

最新更新