我定义了这个结构,并在我的项目中有一个类。它是一个包含GetIdUsingThisString(char *)生成的id号的类,它是一个将纹理文件加载到GPU并返回id(OpenGL)的函数。
问题是,当我尝试读取特定文件时,程序崩溃了。当我在VS中运行此程序并进行调试时,它运行正常,但运行.exe会使程序崩溃(或者在没有调试的情况下从MSVS运行)。通过使用just-n-time调试器,我发现,对于该特定文件的num,Master [num] .name实际上在文件路径的末尾添加了“\ x5”(连接),并且仅生成对于这个文件。没有任何一种方法可以做到这一点,我也使用这种类型的斜杠/路径,而不是\。
struct WIndex{
char* name;
int id;
};
class Test_Class
{
public:
Test_Class(void);
int AddTex(char* path);
struct WIndex* Master;
TextureClass* tex;
//some other stuff...
};
构造
Test_Class::Test_Class(void)
{
num=0;
Master=(WIndex*)malloc(1*sizeof(WIndex));
Master[0].name=(char*)malloc(strlen("Default")*sizeof(char));
strcpy(Master[0].name,"Default");
Master[0].id=GetIdUsingThisString(Master[0].name);
}
添加新纹理:(错误)
int Test_Class::AddTex(char* path)
{
num++;
Master=(WIndex*)realloc(Master,(num+1)*sizeof(WIndex));
Master[num].name=(char*)malloc(strlen(path)*sizeof(char));
strcpy(Master[num].name,path);<---HERE
Master[num].id=GetIdUsingThisString(path);
return Master[num].id;
}
在运行时,使用此文件调用AddTex将具有正确值的路径,而Master [num] .name将在strcpy之后显示此修改后的值(添加“\ x5”)。
问题: 将(strcpy)复制到动态分配的字符串有什么问题吗?如果我使用char name [255]作为WIndex结构的一部分,一切正常。
更多信息: 这个确切的文件叫做“flat blanc.tga”。如果我把它放在我想要的文件夹中,那么在GetIdUsingThisString中的fread会抛出损坏的堆错误。如果我把它放在一个不同的文件夹中就可以了。如果我把它的名字更改为其他任何东西,那就再好了。如果我放一个不同的文件并给它相同的名字,也可以( !!! )。我需要程序没有这种东西的bug,因为我不知道将加载哪些纹理(如果我知道我可以简单地替换它们)。
答案 0 :(得分:0)
根据定义(如下) - 你应该对malloc使用strlen(string)+1。
A C string is as long as the number of characters between the beginning of the string and the terminating null character (without including the terminating null character itself).
The strcpy() function shall copy the string pointed to by s2 (including the terminating null byte)
答案 1 :(得分:0)
Master[num].name=(char*)malloc(strlen(path)*sizeof(char));
应该是
Master[num].name=(char*)malloc( (strlen(path)+1) * sizeof(char));
没有终止NULL字符的地方
来自http://www.cplusplus.com/reference/cstring/strcpy/:
将source指向的C字符串复制到指向的数组中 目的地,包括终止空字符(和 在那一点停下来。)
这里也是如此:
Master[0].name=(char*)malloc(strlen("Default")*sizeof(char));
strcpy(Master[0].name,"Default");