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

时间:2015-10-28 18:40:48

标签: 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()]

使用printf我得到了这个结果:

longueur de mid: 2
longueur de n-mid: 2
longueur de L: 3
longueur de R: 3

为什么输出会有所不同?

2 个答案:

答案 0 :(得分:11)

strlen迭代直到找到空字节。 malloc使未分配的空间保持未初始化状态,因此可能会随机出现空字节。毕竟,由于未初始化的内存访问,它是未定义的行为。

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

注意:

  • don't cast the result of malloc
  • 乘以sizeof(char)多余为sizeof(char) == 1
  • free
  • 之后使用malloc
  • size_t的相应格式说明符,a.k.a。“返回类型strlensizeof运算符”为%zu; %d用于int s 1

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

答案 1 :(得分:2)

正如某人提到的那样,strlen()将输入的输入转换为正确的内存位置,然后该位置递增1直到找到空字符。尝试在来自malloc()调用的指针上使用strlen()的问题是返回指针返回的数据可以是任何东西,具体取决于操作系统处理内存的方式。

如果您希望指针在分配内存时引用一组有保证的空字符,则可以使用以下代码:

L = calloc(1,mid+1); 
R = calloc(1,n - mid+1); 

然后至少当你使用strlen()时,你会得到一个零。

如果必须使用malloc(),则可以使用以下代码:

L = malloc(1,mid+1); 
R = malloc(1,n - mid+1); 
memset(L,0,mid);
memset(R,0,n - mid);

在两段代码中,我假设L和R被声明为char*

并且肯定在使用calloc和malloc分配的所有内存上使用free(),否则可能会导致内存泄漏,从而导致重新启动计算机。

如果要以快速方式在内存中放入固定数量的字节,请在分配内存后使用:

memset(L,x,mid);
memset(R,x,n - mid);

但是将x更改为除零以外的任何值,否则它将为null。

这是一个示例程序,它更符合您的期望:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(){
  int size=10;
  char* a=calloc(1,100); // allocate 100 null's and store pointer to them at 'a'
  printf("%d \n",size); // print wanted size
  printf("%d \n",strlen(a)); // print length of memory space which = 0
  memset(a,'A',size); // put 10 A's at the beginning of allocated memory
  printf("%d \n",strlen(a)); // print length again which now = 10
  printf("%s \n",a); // print memory (which is 10 A's)
  free(a); // free the memory
  return 0; 
}

上面编译好了我的编译器,即使启用了编译器选项-Wall-Wextra也没有警告。