当我将函数用于malloc内存时,为什么这会失败

时间:2015-07-03 12:09:27

标签: c pointers segmentation-fault malloc dynamic-memory-allocation

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

那么,主要的区别是我返回指针的第一个代码,为什么第二个代码出错?

1 个答案:

答案 0 :(得分:3)

C中,函数参数按值传递。因此,从函数内部,您无法更改参数的值,并希望将更改反映到调用者传入的变量中。

简单来说,在您的情况下,从mlc()内部,您可以更改*f的值,并将其反映到*f中的main(),但您无法更改f本身的

  • 您的第一个案例有效,因为在分配内存并将参数 f指向它后,您return表示指针并将其检索到{{1}在f中。因此,在main()中,main()完全有效。

  • 您的第二个案例失败,因为从该函数返回后,f中的f仍然未初始化。