【问题标题】:Strange Segmentation Fault with pointers in CC中带有指针的奇怪分段错误
【发布时间】:2014-11-22 11:47:00
【问题描述】:

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

#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\": %d\n", array);


    tree_punt test;
    printf("tree \"address\": %d\n", test);
    test = (tree_punt)malloc(sizeof(tree));
    test->info = 5;
    printf("info: %d\n", test->info);

 }

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

【问题讨论】:

    标签: c arrays pointers linked-list structure


    【解决方案1】:

    你使用了未初始化的指针:

    int *array;
    fill(array, size);
    

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

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

    int size = 7;
    int array[size];
    

    【讨论】:

    • 或许const int size = 7
    • 非常感谢!我坚持我也可以用这种方式使用指针
    • @Mark 你总是要考虑指针指向的地方
    【解决方案2】:

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

    tree_punt test;
    printf("tree \"address\": %d\n", test);
    test = (tree_punt)malloc(sizeof(tree));
    

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

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 2013-04-14
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      相关资源
      最近更新 更多