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;
}
并且由于您的指针指向随机垃圾,因此这将无法正常工作,并且返回的值无法预测。