C指针指向错误的对象

时间:2013-04-06 11:03:25

标签: c arrays pointers

在我的代码中,我有一个包含10个分数对象的数组,出于测试目的,我只想编辑该数组中的第一个分数。我的.h文件如下:

/*frac_heap.h*/

/*typedefs*/

typedef struct
{
   signed char sign;
   unsigned int denominator;
   unsigned int numerator;
}fraction;

typedef struct
{
    unsigned int isFree;
}block;

void dump_heap();
void init_Heap();
fraction* new_frac(); 

在我的.c文件中有以下内容:

// File frac_heap.c
#include <stdio.h>
#include <stdlib.h>
#include "frac_heap.h"

#define ARRAYSIZE 10

fraction* heap[ARRAYSIZE] = {};
block* freeBlocks[ARRAYSIZE] = {};
int startingBlock = 0;

void init_Heap(){
    int x;
    for(x = 0; x < ARRAYSIZE; x ++){    
        block *currBlock = &freeBlocks[x];
        currBlock->isFree = 1;  
    }

}
void dump_heap(){
    int x;
    for(x = 0; x < ARRAYSIZE; x ++){
        fraction* tempFrac = &heap[x];
        printf("%d\t%d\t%d\n",tempFrac->sign, tempFrac->numerator, tempFrac->denominator);
    }   

}

fraction* new_frac(){
    fraction* testFraction = &heap[0];
    return testFraction;
}  

int main(){

    init_Heap();

    fraction *p1;
    p1 = new_frac();
    p1->sign = -1;
    p1->numerator  = 2;
    p1->denominator = 3;
    dump_heap();
    return 0;
   }

dump_heap()的输出应列出10个分数(它们的符号,分子和分母),其中分数1是唯一被更改的分数。但是,输出如下:

-1  2   3
3   0   2
2   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0

当我只有一个指向分数1的指针作为p1时,如何编辑分数2和3?我使用指针错了吗?

3 个答案:

答案 0 :(得分:2)

你需要malloc()你的结构或定义固定大小的分数数组(如果大小是固定的。

备选方案#1:

fraction heap[ARRAYSIZE][10] = {};

备选方案#2:

fraction* heap[ARRAYSIZE] = {};

void init_Heap(){
int x;
for(x = 0; x < ARRAYSIZE; x ++){    
    block *currBlock = &freeBlocks[x];
    currBlock->isFree = 1;  

    /*MALLOC FRACTIONS*/
    heap[x] = (fraction*)malloc(  sizeof(fraction));
    heap[x]->numerator=0;
    heap[x]->denominator=0;
    heap[x]->sign=0;
    }
}

void dump_heap(){
    ...
    fraction* tempFrac = heap[x]; /*You cannot de-reference heap*/
    ...
}

fraction* new_frac(){
    ...
    fraction* testFraction = heap[0];
    ...
}

答案 1 :(得分:0)

你有两个错误......

第一个是当你从数组中获取指针时使用address-of运算符&。当你在指针上使用它时,你得到一个指向指针的指针,而不是实际的指针。

第二个问题是你没有分配指针。

因此,当您尝试取消引用结构指针时,不仅会访问错误的内存指针,如果删除&运算符,那么您将访问未分配的内存。这两个都会导致未定义的行为。第二个很可能会让你崩溃。


您也无法使用空括号初始化数组。您必须将想要将数组初始化的内容放在大括号内:

fraction* heap[ARRAYSIZE] = { NULL };

答案 2 :(得分:0)

变化

fraction* heap[ARRAYSIZE] = {};
block* freeBlocks[ARRAYSIZE] = {};

fraction heap[ARRAYSIZE] = {0};
block freeBlocks[ARRAYSIZE] = {0};

type* name[SIZE]:制作指针数组

你想要十个分数对象。 fraction arrayName[10];