我写了以下代码:
[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
为什么输出会有所不同?
答案 0 :(得分:11)
strlen
迭代直到找到空字节。 malloc
使未分配的空间保持未初始化状态,因此可能会随机出现空字节。毕竟,由于未初始化的内存访问,它是未定义的行为。
单独确定malloc
块的大小是不可能的。将大小存储在单独的变量中,例如Lsize
和Rsize
。
注意:
malloc
sizeof(char)
多余为sizeof(char) == 1
free
malloc
size_t
的相应格式说明符,a.k.a。“返回类型strlen
和sizeof
运算符”为%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
也没有警告。