#include <stdio.h>
#include <stdlib.h>
char** mlc(char** f){
int count=10;
int size=10;
f=(char**)malloc(count*sizeof(char*));
for(int i=0;i<count;i++){
f[i]=(char*)malloc(size*sizeof(char));
}
return f;
}
int main()
{
char** f;
f=mlc(f);
f[0][0]='1';
f[0][1]=' ';
printf("%s",f[0]);
return 0;
}
我使用这个代码可以完美地工作,但当我使用以下代码时,它会出现分段错误:
#include <stdio.h>
#include <stdlib.h>
void mlc(char** f){
int count=10;
int size=10;
f=(char**)malloc(count*sizeof(char*));
for(int i=0;i<count;i++){
f[i]=(char*)malloc(size*sizeof(char));
}
return f;
}
int main()
{
char** f;
mlc(f);
f[0][0]='1';
f[0][1]=' ';
printf("%s",f[0]);
return 0;
}
所以,主要的区别是我返回指针的第一个代码,为什么第二个代码会出错?
在C
中,函数参数是按值传递的。因此,在函数内部,不能更改参数的值,也不能期望更改反映在调用方传入的变量上。
简单地说,在您的情况下,从mlc()
内部,您可以更改*f
的值,这将反映在main()
中的*f
上,但您不能更改f
本身的值。
-
第一种情况是有效的,因为在分配内存并将参数
f
指向它之后,return
会说出指针,并将其检索到main()
中的f
中。因此,在main()
中,f
是完全有效的。 -
第二种情况失败,因为从函数返回后,
main()
中的f
仍处于未初始化状态。