在我的代码中,我有一个包含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?我使用指针错了吗?
答案 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];