我编写了这段代码来声明一个指针(p),然后为 int 类型动态分配 4 个字节的内存,然后在其中存储一些数据。指针 p 应该指向保存 int 类型数据“6”的地址。然后,程序应使用 * 取消引用运算符从指针变量打印出数据。我还包含了 free() 函数来从堆中释放分配的内存。我不明白为什么我收到总线错误。相同的代码已由同行执行,并且运行得非常好。我使用 Mac M2 并在 vscode 上运行代码。什么可能导致此错误?
#include <stdio.h>
#include <stdlib.h>
void foo(int *a){
a = (int*)malloc(sizeof(int));
}
int main(){
int *p;
foo(p);
*p = 6;
printf("%d",*p);
free(p);
return(0);
}
这是错误消息:zsh:总线错误
请注意,如果我要删除 foo() 函数并将调用行替换为 p = (int*)malloc(sizeof(int));那么程序就完美运行了。为什么在之前的方法中使用它会导致总线错误?
在你的函数
foo
中,参数a
是一个局部变量。您将 malloc
的结果分配给它,但这对此函数调用之外的程序没有影响。
就目前情况而言,您正在取消引用未初始化的指针,从而导致未定义的行为。
要完成此操作,您需要将指针传递给指针。
void foo(int **a) {
*a = malloc(sizeof(int));
}
int main(void) {
int *p;
foo(&p);
*p = 6;
printf("%d", *p);
free(p);
return 0;
}
因为要改变指针的值,所以需要传递指针的地址。否则,您只需拥有地址副本即可。
#include <stdio.h>
#include <stdlib.h>
void foo(int **a){
*a = malloc(sizeof(int));
}
int main(){
int *p;
foo(&p);
*p = 6;
printf("%d",*p); // 6
free(p);
return(0);
}