c 程序调用 malloc 函数导致总线错误?

问题描述 投票:0回答:2

我编写了这段代码来声明一个指针(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));那么程序就完美运行了。为什么在之前的方法中使用它会导致总线错误?

c pointers malloc bus
2个回答
0
投票

在你的函数

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

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.