c - 为什么当我使用函数分配内存时失败

标签 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;
}

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

最佳答案

C 中,函数参数是按值传递的。因此,在函数内部,您不能更改参数的值并期望更改会反射(reflect)到调用方传入的变量上。

简单来说,在您的情况下,您可以从 mlc() 内部更改 *f 的值,这将反射(reflect)到 *fmain() 中,但您不能更改 f 本身的

  • 第一种情况可行,因为在分配内存并将参数 f 指向它之后,您返回 所述指针并检索它在 main() 中进入 f。因此,在 main() 中,f 的使用完全有效。

  • 第二种情况失败,因为从函数返回后,main() 中的 f 仍未初始化。

关于c - 为什么当我使用函数分配内存时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31206547/

相关文章:

c - 制作 : *** No rule to make target

c - void 元素上的指针减法

C:程序在尝试释放 2D 数组本身时崩溃

c - fopen 导致段错误

c++ - 从成员函数创建线程时出现段错误(核心转储)错误

c++ - 指针段错误与未定义行为

c++ - extern "C"用于成员静态回调函数

C - sizeof int 数组总是返回 4

c++ - 通过安排任务最大化分数

创建结构数组的数组