我在项目中定义了此结构和类。这是一个保留由getIdusingThisstring(char *)生成的ID号的类,该函数将纹理文件加载到GPU中并返回ID(OpenGL)。
问题是,当我尝试读取特定文件时,程序会崩溃。当我在调试中运行此程序时,它可以正常工作,但是运行.exe会崩溃该程序(或在不从MSV中调试而无需运行)。通过使用Just-n--Debugger,我发现,对于该特定文件的数字,Master [num]。名称实际上包含" x5"(concatenation)在文件路径末尾,这仅是生成的对于这个文件。此方法没有什么可以做到的,我也可以在路径中使用这种类型的斜线/而不是。
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);
}
添加新纹理:( bug)
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名称[255]作为Windex结构的一部分,一切都很好。
更多信息: 此确切的文件称为" flat blanc.tga"。如果我将其放在我打算使用的文件夹中,那么getIdusingThisstring中的fread会造成损坏的堆错误。如果我将其放在其他文件夹中,则可以。如果我将其更改为其他任何东西,那就可以了。如果我放了一个不同的文件并给它给它相同的名字,那也可以( !!! )。我需要该程序没有这种事情,因为我不知道会加载哪些纹理(如果我知道我可以简单地替换它们)。
Master[num].name=(char*)malloc(strlen(path)*sizeof(char));
应该是
Master[num].name=(char*)malloc( (strlen(path)+1) * sizeof(char));
没有终止零字符的位置
来自http://www.cplusplus.com/reference/cstring/strcpy/:
将源指向的C字符串复制到指向的数组中 目的地,包括终止null字符(和 那时停止)。
这里也发生了同样的事情:
Master[0].name=(char*)malloc(strlen("Default")*sizeof(char));
strcpy(Master[0].name,"Default");
基于定义(下图) - 您应该将strlen(string) 1用于malloc。
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)
- 还请参见如何在调用strcpy之前分配数组的讨论?