我是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
是不必要的,通常被认为是一种可疑的练习 -
n
和i
变量名有点误导人:人们期望它们以另一种方式出现 -
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; ...)
认为,