我的C程序中出现了一个非常奇怪的错误,因此我需要你的帮助!所以我有一个名为path的递归结构,有时我会存储" parent"的地址。结构领域中的路径母亲:
typedef struct path{
struct path* mother;
struct path** children;
int length;
uint8_t* inf;
} path;
所以在我的例子中,我只生成一条这样的路径:
int child_num=2;
int bytes=10;
path* my_path=malloc(sizeof(path));
if (path==NULL) throw error...
my_path->inf=malloc(sizeof(uint8_t)*bytes);
memset(my_path->inf, 4, bytes);
my_path->children=malloc(sizeof(path*)*child_num);
for(int i=0; i<child_num; i++){
my_path->children[i]->mother=my_path;
my_path->children[i]->inf=malloc(sizeof(uint8_t)*bytes);
memset(my_path->children[i]->inf, 5, bytes);
}
所以现在因为我将链接存储到父结构,我想使用另一个帮助指针来访问它的信息:
path* my_pointer=my_path->children[0]->mother; //this is just for the example
所以我检查了地址,一切似乎都没问题,但如果我知道在另一种方法中使用指针,指向字段&#34; inf&#34;,如果我使用变量&#34;路径&#34;这样:
method(path->inf, bytes);
没关系,但我一做就好了:
method(my_pointer->inf, bytes);
该方法在标记的行处崩溃:
void method(uint8_t* element, int bytes) {
if (element==NULL) ... //<=== here it crashes
//do something
}
我真的不知道我做错了什么,我打印地址,一切似乎都很好,即使我在变量上访问某个字节&#34; my_pointer&#34;,所以喜欢
my_pointer->inf[1]
它返回相应的值,但在单独的方法中它不起作用。
答案 0 :(得分:1)
如同评论所示,我们无法使用所提供的信息准确回答您的问题,但我们可以为您指明正确的方向。
首先,我在您的示例中注意到您使用path
作为typedef&lt; d path
结构的变量名称。您需要对变量名称更加冗长,或者实际复制粘贴一些代码以确保我们可以查看实际问题,因为它可能只是命名问题。
总而言之,我认为使用一些代码卫生会让你感觉良好。组织一些用于文件范围的数据结构开销的函数:
static int path_alloc(path* p);
static int path_alloc_kids(path* p, int num);
static int path_alloc(path* p) {
if(p == NULL) { return -1; }
p = (path*)malloc(sizeof(path));
if(p == NULL) { return -2; }
return 0;
}
static int path_alloc_kids(path* p, int num) {
if(p == NULL || num <= 0) { return -1; }
if(!path_alloc(p)) { /* Easier to read and understand, no error handling here to muddle things up */
/* You don't actually need a path**, do you? Think of char *argv[] a.k.a. char **argv, is that what you're actually going for? */
p->children = (path*)malloc(sizeof(path) * num);
if(p->children == NULL) { return -2; }
p->length = num;
} else { return -1; } /* Simple */
return 0;
}
这使得 LOT 更容易理解您的代码,这是指针的主要问题。添加一些方法来释放已分配的子项和根,并设置为以相对抽象的方式使用此路径结构。您可能需要考虑以链表方式使用path
和path_node
,这样您只需分配所需内容。
struct spath_node; /* So it knows of itself */
typedef struct spath_node {
struct spath_node *parent;
struct spath_node *next;
uint8_t *data;
int data_size;
} path_node;
然后通过传入数据大小和父级进行分配,NULL
父级可能意味着它是根节点。
static int path_alloc_node(path_node *parent, int data_size, uint8_t *data);
这使得插入/遍历相对较慢,但更容易理解你出错的地方。
编辑:为了清楚起见,这是我们将子项添加到链表示例的方式:
static int path_alloc_node(path_node *parent, int data_size, uint8_t *data) {
path_node *tmp;
if(parent == NULL || data_size <= 0) { return -1; }
if(parent->next != NULL) { return -3; }
tmp = (path_node*)malloc(sizeof(path_node));
if(tmp == NULL) { return -2; }
else parent->next = tmp;
if(data == NULL) { /* Assume the caller is requesting a new data block of the given size */
data = (uint8_t*)malloc((size_t)data_size);
if(data == NULL) { return -2; }
}
parent->next->data = data;
parent->next->data_size = data_size;
parent->next->next = NULL;
parent->next->parent = parent;
return 0;
}