【问题标题】:strcpy through array of strings passed to a function?strcpy 通过字符串数组传递给函数?
【发布时间】:2021-11-10 21:45:46
【问题描述】:

长话短说,我正在制作这款 3D OpenGL 构建器游戏。细节并不重要,但这是我的问题。我有这个字符串数组:

char building_category_names_UPPER_CASE[][30] = { "NOTHING", "WAREHOUSE", "PROCESSING PLANT", "FACTORY", "OFFICE" }; 

我正在尝试将它们传递给一个函数,该函数接受字符串数组形式的“列表”,并通过 Create_Button 方法为该列表中的每个项目创建按钮。

void Create_Button_List(char** list, int list_size, char* group_name, int pos_x, int pos_y)
{
    for (int i = 1; i < list_size; i++)
    {
        char name[50];
        strcpy(name, list[i]);

        char group[50];
        strcpy(group, group_name);

        Create_Button(name, group, pos_x, i * pos_y, 205, 50, text_color_white, bg_color, text_color_white, bg_color_hover);
    }
} 

但是即使 VS 在构建时没有给我任何错误,当它到达 strcpy(name, list[i]); 部分时我仍然会收到访问冲突错误。

Image of the error

这里有什么问题?这不是我应该如何传递二维字符数组吗?或者是我如何将它传递给strcpy的问题?为了清楚起见,在这种情况下 list_size 是 5,所以这是正确的,问题不应该是 for 循环超出范围。

如果有人可以帮我解决这个问题,请提前致谢!

【问题讨论】:

  • 试试char building_category_names_UPPER_CASE*[] = { ... }
  • 二维数组与指针数组不同。
  • strcpy 是多余的,您应该将原始值传递给函数。这也避免了可能的缓冲区溢出

标签: c pointers multidimensional-array implicit-conversion function-declaration


【解决方案1】:

这个数组

char building_category_names_UPPER_CASE[][30] = { "NOTHING", "WAREHOUSE", "PROCESSING PLANT", "FACTORY", "OFFICE" }; 

在表达式中使用,例如函数参数被隐式转换为指向其第一个元素的指针。

数组的元素类型是char[30]。所以接受这个数组作为参数的函数需要将对应的参数声明为

char ( *list )[30]

指针类型char ( * )[30]char ** 之间没有隐式转换。

所以改变第一个函数参数的类型。

另一种方法只是改变数组的声明,如

char * building_category_names_UPPER_CASE[] = { "NOTHING", "WAREHOUSE", "PROCESSING PLANT", "FACTORY", "OFFICE" }; 

在这种情况下,函数参数可能确实具有char ** 类型。

【讨论】:

  • 就是这样!我将声明更改为“char * building_category_names_UPPER_CASE[]”,它解决了问题,现在它按预期工作。感谢您的解释和解决方案。
  • @Dinosbacsi 完全没有。不客气。:)
猜你喜欢
  • 2011-07-08
  • 2021-11-25
  • 2016-12-08
  • 2015-09-09
  • 2012-10-23
  • 1970-01-01
  • 2014-09-06
相关资源
最近更新 更多