请问Mac端 bus error 怎么解决?

写了一段代码,感觉没有问题,mac上运行就是报错 bus error,去 win 上测试了一下完全没问题,烦死了,也不知道怎么改。

#include<stdio.h>
#include<stdlib.h>
typedef struct Complex_Node {
    float real;
    float imaginary;
    struct Complex_Node *next;  
}Node;

void Init(Node* address){
    address = (Node*)malloc(sizeof(Node));
    if(address == NULL){
        printf("ERROR");
        return;
    }
    (*address).next = NULL;
    return;
}
void Add(Node* address,float real_part,float image_part){
// 这边没有加判断条件,就是做个测试,而且初始化后是空的,就直接加到头节点后面了
    Node* p;

    (*p).real = real_part;
    (*p).imaginary = image_part;
    (*p).next = NULL;
    (*address).next = p; // 经过测试,不访问 p 地址就不报错,但不知道怎么改


    return;
}
// void get(Node* address){
//     Node * p = address;
//     while (p!=NULL)
//     {
//         printf("%f",(*p).real);
//         printf("%f",(*p).imaginary);
//         p = (*p).next;
//     }
// }
int main(){
    Node* index;
    Init(index);
    Add(index,0.5,1.0);
}
回复
阅读 695
2 个回答

Init 方法改成这样:

 void Init(Node** address){
     *address = (Node*)malloc(sizeof(Node));
     if(*address == NULL){
         printf("ERROR");
         return;
     }
     (**address).next = NULL;
     return;
 }

Init 调用改成下面这样:

Init(&index);

你之前的写法,index 变量实际上没有修改成功,它实际上是一个无意义的地址(不是空指针)。

想要通过函数修改指针变量,传递的需要是指针的地址,否则修改不会成功。
例如:

void modify_a(int *a, int v) {
    *a = v;
}
int a = 0;
modify_a(&a, 5);

成不成功跟 mac 没有关系,写代码的过程中,出现问题比不出问题好。
mac: bus error
linux: segment fault

两个系统上都是同样的错误:段错误,一般是访问了一段错误的内存。

在你这个例子中,index是一个uninitialized pointer,指向的位置是“随机”的。可能你想在Init里面初始化它,正如zxdposter所说,因为写法错误,实际上并没有初始化成功。

加两个printf很容易就能看出来:

// 修改1:
void Init(Node* address){
    address = (Node*)malloc(sizeof(Node));
    if(address == NULL){
        printf("ERROR");
        return;
    }
    (*address).next = NULL;
    printf("address = %p\n", address);
    return;
}

// 修改2:
int main(){
    Node* index;
    printf("1 index = %p\n", index);
    Init(index);
    printf("2 index = %p\n", index);
    Add(index,0.5,1.0);
}

在 mac 上

% ./a.out
1 index = 0x10e1cc025
address = 0x7f81b54057f0
2 index = 0x10e1cc025
bus error  ./a.out

在linux下:

$ ./a.out 
1 index = (nil)
address = 0x1c92010
2 index = (nil)
Segmentation fault

可见,mac和linux下index都没有被正确设置。

至于windows下为什么可以运行,纯属巧合。我没有这个环境,无法做更多验证。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏