mallocing字符和空终止符

mallocing字符和空终止符,c,pointers,memory,null,malloc,C,Pointers,Memory,Null,Malloc,如果将一个字符指针指向一个内存块,您只需使用malloc()并在[0]、[1]、[2]、[3]、…、[n]位置为其提供字符,那么malloc是否已经在末尾提供了空终止符“\0”,或者我必须在字符数组的最后一个元素提供它 int i; char B; //has the characters hello char *A=malloc(5*sizeof(char)); //4 bytes for hello + 1 byte for null terminator? for(i=0; i<st

如果将一个字符指针指向一个内存块,您只需使用malloc()并在[0]、[1]、[2]、[3]、…、[n]位置为其提供字符,那么malloc是否已经在末尾提供了空终止符“\0”,或者我必须在字符数组的最后一个元素提供它

int i;
char B; //has the characters hello
char *A=malloc(5*sizeof(char)); //4 bytes for hello + 1 byte for null terminator?
for(i=0; i<strlen(A);i++)
A[i]=B[i];
inti;
字符B//角色们打招呼了吗
char*A=malloc(5*sizeof(char))//hello为4字节+null终止符为1字节?

对于(i=0;iYES您需要显式地放置空终止符。
malloc
只是将起始指针返回到5字节内存块。

malloc
之后,
a
包含垃圾值,因此您需要显式地分配
\0
。但是,您的代码中还有几个其他错误:

您对
B
的声明是错误的,它应该是
char
数组,而不是单个
char

字符串
“hello”
包含6个元素,包括尾随的
\0
,因此:

char B[] = "hello";
char *A = malloc(strlen(B) + 1);
for(i = 0; i < strlen(B) + 1; i++)
    A[i] = B[i];

Malloc将不提供用空值填充的内存

如上所述,使用strcpy并确保安全


我编辑掉了calloc部分。这是错误的。

在strcpy()的情况下,它会复制空终止符?如果我将一个字符初始化为:char a[4]=“hello”;
a[4]="hello
是buffur溢出。您需要一个空间来容纳5个字符+'\0'终止符空间,yes
strcpy
也将复制空终止符。我必须在malloc时为它提供1字节吗?我已经读到空终止符位于可以分配字符的内存区域之外。您始终必须为空字符提供一个额外的字节er以正确终止字符串。单个字符
char B;
不能包含
hello
。但是您可能有
char B[]=“hello”
。调用
strlen(A)
会引发未定义的行为,至少在访问非斜体内存时是如此。
strcpy(A, B);