SDL_CreateTextureFromSurface 在 C 中使用 strcpy、strcat、sprintf 等后崩溃

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?