c -strlen()分配指针



i创建这样的缓冲区,但我不给它内容。然后,我尝试查看此块内存的strlen()。

    int size = 24;
    char *c;
    c = (char *)malloc(size);
    printf("%dn", strlen(c));

我得到的不是24。当我设置尺寸= 18时,结果不再40。它是32.,从C [32]到C [47]的值全部 0。当我设置尺寸= 7时,结果为24,值c [24]到c [47]均为 0。
我知道将strlen用于这样的数组,无法给我Malloc()功能中使用的大小。我只是想知道为什么会发生这种情况,以及当我们更改大小的价值时,结果如何改变?我们有什么可以使用的吗?
编辑:似乎每个人都认为结果是不可预测的。事实始终是8的倍数,当我们增加尺寸时,结果会增加一个限制。我们可以准确确定使结果变化的大小的值,尽管我们测试了多少次,但它不会改变。它不仅取决于C语言或编译器吗?为什么选择8?

您分配的内存未初始化。将其传递给strlen,该函数期望终止字符串,具有未定义的行为。这样您就可以得到任何东西,甚至不必获得任何结果。

C中没有内置的方式来了解分配的内存块的确切大小。

您应该读取文档,strlen()用于字符串的长度。没有太多细节,我会告诉你一件事

无法动态地获取指针的长度,因此您唯一的选择是将其存储并以后使用。

一种简单的优雅方法,是为此使用struct,每次需要时存储大小并使用它。

struct pointer_type {
    void *pointer;
    size_t allocated_size;
};

至于"我得到的不是24,而是40 ",

您的指针是非专业化的。这会导致所谓的未定义行为,因为strlen()的工作方式是通过删除指针和计数字符,直到给定字符发生,类似

之类的东西
int strlen(const char *const str)
{
    int count = 0;
    while (*(str++) != '') ++count;
    return count;
}

并且由于您的指针指向随机垃圾,因此这将无法正常工作,并且返回的值无法预测。

相关内容

  • 没有找到相关文章

最新更新