我创建了一个像这样的缓冲区,但我不给它内容。然后我尝试查看此块内存的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?
答案 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中没有内置方式来了解已分配内存块的确切大小。