奇怪的分段错误与 C 中的指针



我应该做一个程序,从现有数组构建一棵树,并带有一些属性。我的问题不是关于如何做到这一点(我应该做一些递归功能,没关系),因为当我尝试启动构建功能时,我遇到了一些分段错误。所以我试图"隔离"这个问题,当我创建树的根节点时,我看到我遇到了它。我真的不明白为什么我有这个错误(因为我已经使用列表一段时间了,所以,即使我不是大师,我在指针和链接结构方面也不是全新的)。我试图编写一个非常简单的主代码来查看正在发生的事情,我发现我甚至无法初始化单个节点。这是代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct elem {
    int info;
    struct elem *p;
    struct elem *left;
    struct elem *right; 
} tree;
typedef tree* tree_punt;
void fill(int *array, int size) {
    int i;
    for(i=0; i<size; i++) {
        array[i] = i+1;
    }
}
void show(int *array, int size) {
    int i;
    for(i=0; i<size; i++) {
        printf("%d ", array[i]);
    }
    printf("n");
}

int main() {
    int *array;
    int size;
    size = 7;
    fill(array, size);
    show(array, size);
    printf("array "address": %dn", array);

    tree_punt test;
    printf("tree "address": %dn", test);
    test = (tree_punt)malloc(sizeof(tree));
    test->info = 5;
    printf("info: %dn", test->info);
 }

当我将malloc用于测试指针时,我遇到了分段错误。奇怪的是,如果我不将值放入数组中,我就没有问题....为什么?为什么阵列要打扰我可怜的树?

使用未初始化的指针:

int *array;
fill(array, size);

array不会指向任何地方,试图将其传递给fill会导致未定义的行为。

要解决此问题,您可以更改为:

int size = 7;
int array[size];

除了不初始化int数组之外,还可以打印一个具有垃圾值的变量:

tree_punt test;
printf("tree "address": %dn", test);
test = (tree_punt)malloc(sizeof(tree));

在这里,您正在打印test,然后它才具有任何有意义的价值。只需切换最后两行,不要使用%d而是%p(因为它是指针而不是整数)。

相关内容

  • 没有找到相关文章

最新更新