我是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;
}
由于
答案 0 :(得分:4)
您的buffer = (char *) malloc(i+1);
在此功能之外无效。实际上,该函数正在更改其自己的buffer
副本,并且调用者(main
)从未看到此更改。这在C FAQ中已得到很好的解释。
不是将它作为参数传递,而是可以返回缓冲区,因为此函数暂时不返回任何内容:
char *f(int i)
/* ... */
return buffer;
/* ... */
char * buffer = f(5);
malloc
是不必要的,通常被认为是
可疑的做法n
和i
变量名称有些误导:人们希望它们反过来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; ...)
此致