c-当我使用一个函数对内存进行malloc时,为什么失败了


#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仍处于未初始化状态。

相关内容

  • 没有找到相关文章

最新更新