【问题标题】:mallocing a char and null terminator分配一个 char 和 null 终止符
【发布时间】:2013-09-17 05:04:17
【问题描述】:

如果您将 char 指针指向一块内存,您只需 malloc() 并在位置 [0]、[1]、[2]、[3]、...、[n] 处输入字符malloc 已经在末尾提供了一个空终止符 '\0' 还是我必须在 char 数组的最后一个元素处提供它?

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];

在 for 循环结束后,我应该在 A 的最后一个元素中添加一个空终止符还是 malloc() 已经提供了它?

【问题讨论】:

  • 单个字符char B; 不能包含hello。不过你可能有char B[] = "hello";
  • strlen(A) 的调用至少在访问未初始化的内存时会引发未定义的行为。

标签: c pointers memory null malloc


【解决方案1】:

YES 您需要明确放置一个空终止符。 malloc 只是返回指向 5 字节内存块的起始指针。

【讨论】:

  • 在 strcpy() 的情况下,它会复制空终止符吗?另外,如果我将 char 初始化为: char A[4]="hello";
  • A[4]="hello 是缓冲区溢出。你需要一个空间来容纳 5 char + '\0' 终止符空间,是的 strcpy 也会复制空终止符。
【解决方案2】:

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];

或者你可以简单地使用strcpy:

strcpy(A, B);

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 当我 malloc 时我还必须为它提供 1 个字节吗?我读到空终止符位于我可以分配字符的内存区域之外。
    • 您总是必须为空字符提供一个额外的字节才能正确终止您的字符串。
    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多