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
中的 myArr
对 main
中的 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
变成 2
,foo1(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 给它分配了一个不同的值。
我对这段代码的行为有点困惑,
#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
中的 myArr
对 main
中的 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
变成 2
,foo1(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 给它分配了一个不同的值。