【发布时间】:2020-12-14 20:50:48
【问题描述】:
我对这段代码的行为有点困惑,
#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 吗?这是真的吗?!!
【问题讨论】:
-
如果你使用real编译器,它有一个静态代码检查器。
clang -analyze..但是您也可以简单地注意到您的论点缺少一层间接性以使您的东西起作用。 -
当然要注意call stack,但请记住,在某些情况下优化编译器可能会在某些processor register 中添加automatic variable。更多信息,请阅读this draft报告
-
@Basile Starynkevitch,在阅读了本书的某些部分之后,您提到了(现代 C),我发现它真的很有趣,它对我了解 C 编程语言有很大帮助。非常感谢您介绍这本书。
-
@AliNaderiParizi:花点时间阅读this draft,如果有兴趣,请通过电子邮件与我联系
basile@starynkevitch.net
标签: c memory segmentation-fault malloc