【发布时间】:2016-03-13 18:14:12
【问题描述】:
我在我的 C 程序中遇到了一个非常奇怪的错误,因此我需要你们的帮助!所以我有一个称为路径的递归结构,有时我将“父”路径的地址存储在结构字段母亲中:
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
所以我检查了地址,一切似乎都很好,但如果我知道在另一个方法中使用指针,指向字段“inf”,那么如果我使用变量“path”,它就可以工作:
method(path->inf, bytes);
没关系,但只要我这样做:
method(my_pointer->inf, bytes);
方法在标记的行崩溃:
void method(uint8_t* element, int bytes) {
if (element==NULL) ... //<=== here it crashes
//do something
}
我真的不明白我做错了什么,我打印了地址,一切似乎都很好,即使我通过变量“my_pointer”访问某个字节,就像
my_pointer->inf[1]
它会返回相应的值,但在单独的方法中它不起作用。
【问题讨论】:
-
你是如何确定它在
if (element == NULL)崩溃的?我怀疑它并没有真正崩溃,因为那里没有什么会导致错误的内存引用。问题可能发生在此之前,这是您未显示的代码。可能是对method的调用之一。您对method的第一个参数是path->inf或my_pointer->inf或my_path->...。所以检查path、my_pointer和my_path是否有效。 -
如果
path和my_pointer确实指向同一个内存位置,那么method(path->inf, bytes)和method(my_pointer->inf, bytes)应该产生完全相同的结果。所以我的猜测是你把问题简化得太多了,不小心漏掉了一些重要的细节。你能写一个简短、完整、最小的程序来一致地重现问题吗? -
sizeof(uint8_t)是多余的,因为它始终是1。 (如果平台上完全存在uint8_t,它的大小将与unsigned char相同,并且sizeof(unsigned char)始终是1。) -
是的,确实我试图用尽可能少的行来简化我遇到的问题,我会尝试让它更复杂地重现它,但现在我不知道如何。我确信它会在该行崩溃,因为每个崩溃原因我都有其他“错误消息”