在不使用内存操作方法(malloc ...等)的情况下初始化c中的结构
Initializing a structure in c without the use of memory manipulation methods(malloc... and so on)
我试图在不使用 malloc 或任何内存方法的情况下初始化结构指针。这样做时,当我尝试增加堆的大小时,我得到了 分段错误 。现在,我敢打赌我做错了。我在分配 dataHeap 时没有初始化所有字段(我遗漏了一个结构节点数组)。下面是否有正确的方法或者请指点我类似的问题?
///node_heap.h///
8 #ifndef NODE_HEAP_H
9 #define NODE_HEAP_H
10
11 #include <stdio.h>
12 #include <stdlib.h>
13
15 #define NUL '[=10=]'
16
18 #define NUM_BITS 8
19
21 #define MAX_CODE NUM_BITS + 1
22
24 #define NSYMS 1 << NUM_BITS
25
37 typedef struct Symbol_S {
39 size_t frequency;
40
42 size_t bit;
43
45 char symbol;
46
48 char codeword[MAX_CODE];
49 } Symbol;
50
60 typedef struct Node_S {
62 size_t frequency;
63
65 size_t num_valid;
66
68 Symbol syms[NSYMS];
69
70 } Node;
71
82 typedef struct Heap_S {
84 size_t capacity;
85
87 size_t size;
88
90 Node array[NSYMS];
91 } Heap;
/////////
//Heap.c//
#include "node_heap.h"
Heap dataHeap;
void initialize_heap( Heap * heap){
dataHeap = (Heap){0,250}; //size_T size, size_T max_HeapSize, Node[255]
heap = &dataHeap;
}
increaseSize(*Heap heap){
heap->size++;
}
///////////
// Main.c//
///////////
#include "node_heap.h"
main(){
Heap* myHeap = NULL;
initialize_heap(myHeap);
increaseSize(myHeap);'
}
当您将变量传递给函数时,函数会收到该变量的副本。如果您传递一个值并更改它,则更改不会反映在函数外部。要更改指针的值,您可以传递指针的地址,然后通过该地址更改该指针。
void initialize_heap( Heap** heap)
{
dataHeap = (Heap){0,250}; //size_T size, size_T max_HeapSize, Node[255]
*heap = &dataHeap;
}
main()
{
Heap* myHeap = NULL;
initialize_heap(&myHeap);
...
}
如果我想通过方法初始化堆来修改值,我必须做一些稍微不同的事情。
Heap dataHeap;
void initialize_heap( Heap *heap){
heap->size = 0;
heap->max_size = 255;
}
increaseSize(*Heap heap){
heap->size++;
}`
然后,当我尝试初始化堆时,我只是
像这样初始化它
Heap heap;
initialize_heap(&heap);
我试图在不使用 malloc 或任何内存方法的情况下初始化结构指针。这样做时,当我尝试增加堆的大小时,我得到了 分段错误 。现在,我敢打赌我做错了。我在分配 dataHeap 时没有初始化所有字段(我遗漏了一个结构节点数组)。下面是否有正确的方法或者请指点我类似的问题?
///node_heap.h///
8 #ifndef NODE_HEAP_H
9 #define NODE_HEAP_H
10
11 #include <stdio.h>
12 #include <stdlib.h>
13
15 #define NUL '[=10=]'
16
18 #define NUM_BITS 8
19
21 #define MAX_CODE NUM_BITS + 1
22
24 #define NSYMS 1 << NUM_BITS
25
37 typedef struct Symbol_S {
39 size_t frequency;
40
42 size_t bit;
43
45 char symbol;
46
48 char codeword[MAX_CODE];
49 } Symbol;
50
60 typedef struct Node_S {
62 size_t frequency;
63
65 size_t num_valid;
66
68 Symbol syms[NSYMS];
69
70 } Node;
71
82 typedef struct Heap_S {
84 size_t capacity;
85
87 size_t size;
88
90 Node array[NSYMS];
91 } Heap;
/////////
//Heap.c//
#include "node_heap.h"
Heap dataHeap;
void initialize_heap( Heap * heap){
dataHeap = (Heap){0,250}; //size_T size, size_T max_HeapSize, Node[255]
heap = &dataHeap;
}
increaseSize(*Heap heap){
heap->size++;
}
///////////
// Main.c//
///////////
#include "node_heap.h"
main(){
Heap* myHeap = NULL;
initialize_heap(myHeap);
increaseSize(myHeap);'
}
当您将变量传递给函数时,函数会收到该变量的副本。如果您传递一个值并更改它,则更改不会反映在函数外部。要更改指针的值,您可以传递指针的地址,然后通过该地址更改该指针。
void initialize_heap( Heap** heap)
{
dataHeap = (Heap){0,250}; //size_T size, size_T max_HeapSize, Node[255]
*heap = &dataHeap;
}
main()
{
Heap* myHeap = NULL;
initialize_heap(&myHeap);
...
}
如果我想通过方法初始化堆来修改值,我必须做一些稍微不同的事情。
Heap dataHeap;
void initialize_heap( Heap *heap){
heap->size = 0;
heap->max_size = 255;
}
increaseSize(*Heap heap){
heap->size++;
}`
然后,当我尝试初始化堆时,我只是 像这样初始化它
Heap heap;
initialize_heap(&heap);