2010-10-27 51 views
2

编辑:更新后的代码与新引擎收录链接,但它仍然在信息 - 停止>公民[X] - >名while循环。增加了对循环的realloc并整理了代码。任何更多的评论,将不胜感激C内存溢出(V2)

我在与内存分配溢出的一些问题

http://pastebin.com/vukRGkq9(V2)

无论我怎么努力,根本就没有足够的内存被分配用于信息 - >公民和GDB经常说它无法访问信息 - >公民[X] - >名称。

有时,我甚至会在printf语句的strlen后面直接得到KERN_INVALID_ADDRESS错误(Strlen在代码中没有用于gdb由于错误而暂停的地方,但我假定printf以某种方式使用strlen )。我认为这与结构如何分配内存有关。所以我想知道是否有人可以看看?

+0

您是否试图尽可能缩小代码,以便只有存在问题的行?调查对我们和您来说都会容易得多。 – mouviciel 2010-10-27 13:22:14

+0

你是什么意思,“更新的代码”?你的意思是你已经为你的问题提出了很好的答案,因为他们现在指出那些不在那里的线?哦,是的,你确实,这两个版本不同,足以包含完全不同的错误集。嗯... – 2010-10-27 14:53:53

回答

7

你不应该做malloc(sizeof(PEOPLE*)),因为它分配为指针字节(在32位拱部4个字节)的确切数量。
看来你想要做的事情是malloc(sizeof(PEOPLE) * N),其中N是最大。你想放入内存块的人数。

3

显然,问题在于:

info->citizens = malloc(sizeof(PEOPLE *)); 
info->citizens[0] = malloc(sizeof(PEOPLE *)); 
info->citizens[1] = malloc(sizeof(PEOPLE *)); 

想想它在逻辑上你正试图在这里做。

+0

-1这是一个问与答网站不是一个问题和思考的网站... – Tomas 2010-10-27 13:07:20

+4

我不同意,这是完全有效的事情给予提示而不是完整的答案,特别是如果问题是(主观)琐碎:) – 2010-10-27 13:12:30

+0

+1给一个人一条鱼/教一个人去钓鱼... – dawg 2010-10-27 16:02:51

0

看来你有一个间接层次太多。你为什么用**citizens而不是*?

此外,除了为指针分配空间而不是结构之外,还有一些奇怪的事情,比如第31行的局部变量info意味着初始分配超出范围一次块关闭在第34行

你需要更清楚地了解哪些数据是哪里的想法。

0

很多与此代码的内存分配问题。例如:

info->citizens[masterX]->name = malloc(sizeof(char)*strlen(dp->d_name)+1); 
info->citizens[masterX]->name = dp->d_name; 

您不能通过赋值(使用=)复制C中的字符串。你可以写为:

info->citizens[masterX]->name = malloc(strlen(dp->d_name)+1); 
strcpy(info->citizens[masterX]->name, dp->d_name); 

或者你可以凝聚整个分配&拷贝如下:

info->citizens[masterX]->name = strdup(dp->d_name); 
在线路147分之143(除非在这种情况下,

同样你也太分配一个字节很少在你的malloc调用中)。

1

你的结构应该几乎肯定不会包含的成员,如:

time_t *modtimes; 
mode_t *modes; 
bool *exists; 

相反,你应该简单地使用:

time_t modtimes; 
mode_t modes; 
bool exists; 

这样,你就不需要动态地分配他们,或随后释放他们。原因是a)它们很小,b)它们的大小是事先知道的。您使用:

char *name; 

一个字符串字段,因为它是不小的,你事先不知道它是多么大。

在其他地方的代码,您在folllowing:

if(top) 
{ 
    PEOPLE *info; 
    info = malloc(sizeof(PEOPLE *)); 
} 

如果顶部为真,那么这段代码分配一个指针,然后立即漏了 - 第二信息的范围是有限的到if语句,所以你以后也不能使用它,也不能在以后使用它。您需要这样做:

PEOPLE *process(PEOPLE *info, ...) 
{ 
    if (top) 
    { 
    info = malloc(sizeof(PEOPLE)); 
    } 

    info->name = strdup("Henry James"); 
    info->exists = true; 
    return info; 
}