C malloc() 中的内存分配

Memory allocation in C malloc()

我对这段代码的行为有点困惑,

#include <stdio.h>
#include <stdlib.h>

char* foo(){
   char* arr = (char*)malloc(sizeof(char)*100);
   return arr;
}

void foo1(char* myArr){
 char* arr = (char*)malloc(sizeof(char)*100);
 myArr = arr;
}

int main(){
  char* myArr;
  foo1(myArr);
  myArr[23] = 'a';
  printf("%c", myArr[23]);
  return (0);

}

当我调用 myArr = foo() 时,它工作得很好,分配的内存地址的值将分配给 myArr,并且我有一个没有错误的分配内存段。另一方面,当我调用函数 foo1(myArr) 时,它必须将 myArr 传递给函数,它是一个指向段的指针,因此对这个指针的任何更改都会影响内存段,(例如,如果我想交换两个字符串值,我可以简单地交换指针),但我会得到一个 segmentation fault error,为什么?因为 myArr 不是 main 函数中的 myArr?是真的吗?!!

您调用了两个不同的变量 myArr,这可能让您感到困惑。更改 foo1 中的 myArrmain 中的 myArr 没有影响,只是因为它们具有相同的名称。您将 main 中的 myArr 的值传递给 foo1,但没有返回任何内容。

void foo1(char* myArr){
 char* arr = (char*)malloc(sizeof(char)*100);
 myArr = arr;
}

这在概念上与以下内容没有区别:

void foo1(int j) {
    int q = 2;
    j = q;
}

正如 foo1(3) 不会以某种方式将 3 变成 2foo1(myArr) 也不会改变 myArr 的值。 myArr 是一个指针并没有改变它的语义——C 是按值传递的,句号。所以只有 myArr 的值被传递给函数。

  char* myArr;
  foo1(myArr);

请注意,myArr 未在此处分配值,因此您传递的 foo1 指针的值没有特别指向任何内容。 foo1 无法用该值做任何有用的事情。

你可能想要:

void foo1(char** myArrPtr){
 char* arr = (char*)malloc(sizeof(char)*100);
 *myArrPtr = arr;
}

 char* myArr;
 foo1(&myArr);

这样,函数得到一个指向myArr的指针,然后修改指针指向的东西,也就是main中的myArr

C 中的参数是 always call-by-value -- 参数获取调用者传递的内容的 copy 并且是一个新变量,因此如果函数更改参数的值,它不会影响传入的任何值。因此,当您调用

foo1(myArr);

myArr 的值不会改变,即使 foo1 给它分配了一个不同的值。