2016-03-08 43 views
1

我完全失去了对这个“大小1的无效写”尽管现在正试图寻找一个解决方案了大约两个小时:Ç - Valgrind的 -

Valgrind是吐出了一堆大小的无效读1和这个代码无效写入大小为1,我无法弄清楚如何解决它。

char *movieGetDirector(const movie *m) 
{ 
char *tmp = NULL ; 
tmp = malloc(strlen(m->director)+1) ; 
strcpy(tmp, m->director) ; 
return tmp ; 
} 

它越来越尺寸1与strlen的行了一个无效的读取,然后在strcpy的线无效写。我知道m-> director绝对是一个字符串,因为使用gdb测试它确实显示它是一个字符串,并且它有文本。谷歌的这个错误的所有解决方案都与那里没有那个+1有关,但是我已经在那里了,这仍然是一个问题。我怎样才能解决这个问题?

+4

什么是'm',它是如何初始化的?什么是'm-> director',它是如何初始化的?请尝试创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们展示,包括初始化结构及其成员的方式以及如何调用函数。 –

+2

您确定'm-> director'指向有效内存中的零终止字符串吗? –

+1

确定'm-> director'在传入之前是否已分配/保存好_its_ null终止? –

回答

2

你的malloc/strlen/strcpy调用看起来不错。最有可能的设置m和m的director字段的代码是做错了,内存已损坏。你应该再次检查变量分配的位置&已初始化。

表示,您的功能似乎是复制现有strdup功能。所以你可能想写:

char *movieGetDirector(const movie *m) 
{ 
    return strdup(m->director); 
}