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 无法找到字体文件。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...