当前位置: 首页 > 知识库问答 >
问题:

将数组转换为char*是否意味着字符串的长度有限制?

徐飞尘
2023-03-14
#include <stdio.h>
#include <string.h>

struct S
{
    int x[1];
};

union U
{
    struct S arr[64];
    char s[256];
};

int main()
{
    union U u;
    strcpy(u.s, "abcdefghijklmnopqrstuvwxyz");
    size_t len = strlen((char*)&u.arr[1].x);
    puts(len > 10 ? "YES" : "NO");
    return 0;
}

共有1个答案

益英逸
2023-03-14

是的,GCC 8.1正在使用未定义的行为。在调用strlen时,您可以对大小为1的数组int进行越界访问。

strlen((char*)&u.arr[1].x);

&u.arr[1].x的类型是int(*)[1]。然后,您将其铸为char*。除非用作sizeof的操作数,否则数组的地址与第一个元素的地址具有相同的值。因此,在强制转换之前,它的值为&u.arr[1].x[0],类型为int[1]。假设sizeof(int)==4,您可以看到,读取超过4个字节会导致越界访问。

大小为1的数组之后是否有有效内存并不重要。如果使用小尺寸的基指针派生指针并从中读取,则行为未定义。

 类似资料:
  • 我正在阅读在进入SQL查询之前是否需要转义$_session['username']?它说“您需要转义传递给sql查询的每个字符串,而不管它的来源是什么”。现在我知道像这样的东西是非常基本的。谷歌搜索结果超过2万个。仅Stackoverflow就有20页的结果,但没有人真正解释什么是转义字符串,或者如何转义字符串。这只是假设。你能帮帮我吗?我想学习,因为我一直在用PHP制作一个web应用程序。 我

  • 问题内容: 我基本上是在寻找相反的东西。 我将以下内容作为字符串: 我想要以下内容(传递给): 问题答案: 你要。向其传递一个数组作为第二个参数,它将从您提供给数组的查询字符串中提取变量: 请注意,这是页面上列出的第一个相关功能。

  • 问题内容: 是否存在将“ \ uFFFF”之类的字符串转换为字符的标准方法,即六个字符的字符串包含一个Unicode字符的表示形式? 问题答案: 该值直接解释为所需的字符串,整个序列实现为单个字符。 换句话说,如果要对值进行硬编码: 请注意,这似乎不是适当的Unicode字符,但请尝试使用例如。 在此处阅读有关Unicode转义的信息

  • 我有一个购物车php页面,在那里我显示客户端产品。在同一页中,我有一个表单,可以将客户的个人详细信息(如姓名、姓氏等)以及产品信息(如产品名称、数量等)直接发送到我的电子邮件地址。 现在,问题是,当我发送表单时,在我的电子邮件地址上,我收到了所有的信息,但没有产品细节,例如在订单电子邮件中的产品名称字段,我有ARRAY。 我看到将数组转换为字符串时出现问题,但我不知道如何转换,我尝试了几个示例,但

  • 问题内容: 我有一个char数组: 我目前的解决方案是 但是肯定有更好的方法吗? 问题答案: 不,该解决方案是绝对正确的,而且非常少。 但是请注意,这是一种非常不寻常的情况:因为是在Java中专门处理的,所以实际上甚至是一个。因此,在普通代码中不需要将拆分为单个s并将其重新连接。 将此与C / C 进行比较,在C / C 中,你的捆绑在一侧和另一侧以零字节结尾,并且由于传统方法而在它们之间进行了许

  • 我正在使用Schembuf在带有套接字的计算机之间更改数据。要传输数据,我使用以下内容: 然而,我注意到Protobuf无法读取任何非int类型的接收数据(它将其分配给0)。果不其然,如果我不使用套接字,但试图用相同的代码片段返回消息,则会发生相同的情况: 我还指出: 那么,为什么我不能正确地将数据转换回字符串呢?如果这是一个参考问题,为什么protobuf不能读取字符数组数据或从字符数组转换的字