如何解决SDL_CreateTextureFromSurface 在 C 中使用 strcpy、strcat、sprintf 等后崩溃
TTF_Font* font = TTF_OpenFont("arial.ttf",15);
SDL_Color text_color = { 255,255,255 };
SDL_Surface* text_surface = TTF_RenderText_Blended_Wrapped(font,"inventory",text_color,100);
SDL_Texture* text_texture = SDL_CreateTextureFromSurface(rend,text_surface);
我在这下面还有一些其他的东西,但这并不重要。重点是这个作品。现在,我不想一直说“库存”,而是想用一个字符串来控制它。这是我在上面代码之前放的:
char inv_string[] = "";
char items[15][10] = { "air","cloud","water","wood ","leaves ","in_cave","grass ","dirt ","stone ","coal ","iron ","gold ","diamond","player" };
if (item_count <= 0) strcpy(inv_string,"your inventory is empty\n");
if (item_count > 0) sprintf(inv_string,"> %s %d <",items[inventory->item],inventory->amount);
if (item_count > 1) sprintf(inv_string + strlen(inv_string)," %s %d\n",items[inventory->next->item],inventory->next->amount);
if (item_count > 2) sprintf(inv_string + strlen(inv_string),items[inventory->next->next->item],inventory->next->next->amount);
if (item_count > 3) sprintf(inv_string + strlen(inv_string),items[inventory->next->next->next->item],inventory->next->next->next->amount);
if (item_count > 4) sprintf(inv_string + strlen(inv_string),items[inventory->next->next->next->next->item],inventory->next->next->next->next->amount);
for (unsigned int i = 5 - item_count; i > 0; i--) sprintf(inv_string + strlen(inv_string)," empty\n");
并且字符串包含我需要的内容。但是现在即使没有将 "inventory"
替换为 inv_string
,我在 SDL_CreateTextureFromSurface 中也会收到访问冲突错误。有人能告诉我为什么会发生这种情况以及如何解决吗?
提前致谢,祝您有美好的一天!
解决方法
声明
strcpy(inv_string,"your inventory is empty\n");
将导致未定义的行为,因为内存缓冲区 inv_string
只有一个字节的空间。但是,需要 25 个字节的大小来存储整个字符串,包括终止的空字符。这会导致 buffer overflow。
对 sprintf
的函数调用也存在同样的问题,因为它们还要求缓冲区大小大于单个字节。
最明显的解决方案是增加 inv_string
的大小,例如:
char inv_string[200] = "";
另一种方法是使用动态内存分配。你可以换行
char inv_string[] = "";
到
char *inv_string;
然后使用 malloc
使该指针指向特定大小的已分配内存。如果您稍后确定需要更大的内存块,则可以使用 realloc
请求更多内存。
如果您发现 C 中字符串的内存管理过于繁琐和复杂,那么您可能需要考虑使用 C++ 而非 C 编写程序。std::string
C++ 类会为您处理字符串的内存管理.
我设法修复了它,一部分是你们指出的,所以谢谢你,另一件事是 SDL 无法找到字体文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。