#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]='\0';
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]='\0';
printf("%s",f[0]);
return 0;
}
那么,主要的区别是我返回指针的第一个代码,为什么第二个代码出错?
答案 0 :(得分:3)
在C
中,函数参数按值传递。因此,从函数内部,您无法更改参数的值,并希望将更改反映到调用者传入的变量中。
简单来说,在您的情况下,从mlc()
内部,您可以更改*f
的值,并将其反映到*f
中的main()
,但您无法更改f
本身的值。
您的第一个案例有效,因为在分配内存并将参数 f
指向它后,您return
表示指针并将其检索到{{1}在f
中。因此,在main()
中,main()
完全有效。
您的第二个案例失败,因为从该函数返回后,f
中的f
仍然未初始化。