首页 > 解决方案 > realloc 是否在重新分配的字符串中包含 \0?

问题描述

我需要重新分配通过 获取的字符串scanf("%ms", ...),是否会realloc自动在重新分配的字符串中包含终止字符\0realloc在这种情况下的行为是什么?

\0它会在重新分配的字符串的末尾添加,还是将它留\0在前一个字符串的相同位置,在之后添加未初始化的内存\0

例如:

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

int main() {
    char *string = NULL;
    char *p = NULL;
    int length = 0;
    //This should automatically add \0 at the end, if i'm not wrong
    scanf("%ms", &string);
    length = strlen(string);
    p = realloc(string, sizeof(char) * (length + 10));
    if (p != NULL) {
       string = p;
       p = NULL;
    }
    free(string);
    return 0
}

PS:我strlen()在这里使用过字符串:strlen with scanf("%ms"...)

标签: cstringscanfdynamic-memory-allocation

解决方案


realloc不知道/不关心空字节或给定对象中存储的任何其他内容。它只是保证旧内容被保留/复制到它返回的新对象中(假设realloc调用成功)。只要您之前添加了它,它也会在那里realloc。在你的情况下,空字节在那里(假设scanf成功),所以它也会在那里realloc

但是,请注意,如果您使用缩小对象realloc,则只会保留指定大小的内容 - 在这种情况下,您可能没有 . 之后的空字节realloc


推荐阅读