下面的代码尝试初始化节点,并在此过程中动态初始化指向子节点的指针数组。但是,当我尝试访问孩子时,我得到Segmentation fault: 11
。我意识到我不应该得到任何有意义的值(即它只是内存中的垃圾)但我不知道为什么我会得到分段错误。
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#define INIT_SIZE 10
typedef struct node_t node_t;
struct node_t {
char *word;
node_t **children;
int arr_len;
};
void set_array_vals(node_t *root);
int main(int argc, char const *argv[]) {
char *word = "hello";
node_t *root = malloc(sizeof(node_t));
assert(root);
root->children = malloc(sizeof(node_t *) * INIT_SIZE);
assert(root->children);
root->arr_len = INIT_SIZE;
root->word = malloc((sizeof(char)) * (strlen(word) + 1));
assert(root->word);
strcpy(root->word, word);
set_array_vals(root);
printf("Arr len: %d\n", root->arr_len);
return 0;
}
void set_array_vals(node_t *root) {
int i;
for (i=1; i<root->arr_len; i++) {
node_t *this_node = root->children[i];
printf("%d: %d\n", i, this_node->arr_len);
}
}
答案 0 :(得分:3)
在set_array_vals
中,您从“数组”root->children
获得指针,但该数组未初始化,指针将不确定并且看似随机。取消引用这些指针会导致undefined behavior。
此外,您似乎忘记了数组索引从零开始。一旦你使root->children
数组中的所有指针都有效,你就必须记住初始化它们指向的结构,否则this_node->arr_len
的值将是不确定的。
答案 1 :(得分:0)
正如其他人所指出的,首先children
属于node_t **
类型&amp;您只为root->children
而不是root->children[row]
分配了内存。为root->children[row]
&amp;动态分配内存分配一些值。它可能看起来像
root->arr_len = INIT_SIZE;
for(int row = 0; row < root->arr_len ;row++) {
root->children[row] = malloc(sizeof(node_t));/* allocate memory for each children */
root->children[row]->arr_len = row + 99;/* ?? assign some values into member of struct so that you can print in
set_array_vals & verify */
}
在set_array_vals()
开始从i=0
开始打印,您已将内容从root->children[0]
分配到root->children[9]
&amp;访问超出大小可能会导致未定义的行为。
void set_array_vals(node_t *root) {
for (int i = 0; i < root->arr_len; i++) { /* start printing from i=0 , not i=1 */
#if 0
node_t *this_node = root->children[i]; /* no need of any temporary pointer */
printf("%d: %d\n", i, this_node->arr_len);
#endif
printf("%d: %d\n", i, root->children[i]->arr_len);
}
}