为什么strlen不适用于mallocated内存?

Whi*_*ite -2 c malloc strlen

我写了以下代码:

[all the required initialization]

printf("longueur de mid: %d\n",mid);
printf("longueur de n-mid: %d\n",n - mid);

L = (char*) malloc((mid)*sizeof(char)); 
R = (char*) malloc((n - mid)*sizeof(char)); 

printf("longueur de L: %d\n",strlen(L));
printf("longueur de R: %d\n",strlen(R));

[data treatment and free()]
Run Code Online (Sandbox Code Playgroud)

随着printf我得到了这个结果:

longueur de mid: 2
longueur de n-mid: 2
longueur de L: 3
longueur de R: 3
Run Code Online (Sandbox Code Playgroud)

为什么输出会有所不同?

cad*_*luk 11

strlen迭代直到找到空字节.malloc将分配的空间保留为未初始化,因此可以随机出现空字节.毕竟,由于未初始化内存的访问,它是未定义的行为.

malloc不可能单独确定块的大小.将大小存储在单独的变量中,例如LsizeRsize.


笔记:

  • 不要施放结果 malloc
  • 乘以sizeof(char)是多余的sizeof(char) == 1
  • free之后使用malloc
  • 相应的格式说明符size_t,又名"返回类型strlensizeof运算符" %zu; %d用于ints 1

1作为@chux在对此答案的评论中注明

  • `sizeof(char)`是没有意义的,但`sizeof(L)`不是,因为即使```的类型改为其他东西,如`wchar_t`,它也能正常工作.类型名称几乎不应传递给`sizeof`. (2认同)
  • 建议对一个好的答案进行注释: `printf("longueur de L: %d\n",strlen(L));` 是 UB - 应该是 `%zu`。`strlen()` 返回一个 `size_t`,就像 `malloc(size_t n)` 所采用的类型一样。 (2认同)