分配指针

时间:2017-03-09 11:29:04

标签: c malloc strlen

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

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

我得到的不是24而是40.我试着查看从c [40]到c [47]的值,我总是得到\ 0但是在c [47]之后不再是null。 当我设置size = 18时,结果不再是40。它是32.而c [32]到c [47]的值都是\ 0。 当我设置size = 7时,结果为24,c [24]到c [47]的值都是\ 0。
我知道使用strlen这样的数组不能给我我在malloc()函数中使用的大小。 我只是想知道为什么会发生这种情况,当我们改变大小的值时,结果会如何变化?我们可以用这个来处理吗?
编辑:似乎每个人都认为结果是不可预测的。事实上,它总是8的倍数,当我们增加尺寸时,结果会增加。我们可以确切地确定使结果发生变化的大小值,并且尽管我们测试了多少次,它也不会改变。它是否依赖于操作系统而不仅仅是C语言或编译器?为什么选择8?

2 个答案:

答案 0 :(得分:2)

您应该阅读文档,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++) != '\0') ++count;
    return count;
}

并且因为你的指针指向随机垃圾,这将无法正常工作,并且返回的值是不可预测的。

答案 1 :(得分:2)

您分配的内存未初始化。将它传递给strlen,一个期望NUL终止字符串的函数具有未定义的行为。所以你可以得到任何东西,你甚至不需要得到任何结果。

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