代码之家  ›  专栏  ›  技术社区  ›  Mattia Surricchio

重新分配字符串中是否包含\0?

  •  -1
  • Mattia Surricchio  · 技术社区  · 7 年前

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

    会增加吗 \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
    }
    

    附言 :我用过 strlen() 在绳子上像这样: strlen with scanf("%ms"...)

    3 回复  |  直到 7 年前
        1
  •  3
  •   chqrlie    7 年前

    realloc 不知道/不关心给定对象中存储的空字节或其他内容。它只是保证在返回的新对象中保留/复制旧内容(假设 重新分配 调用成功)。只要你以前添加过它,它就会在之后出现 重新分配 我也是。在你的例子中,有空字节(假设 scanf 成功了),所以在那之后 重新分配 我也是。

    但是,请注意,如果您 收缩 对象具有 重新分配 ,则只保留指定大小的内容-在这种情况下,后面不能有空字节 重新分配 .

        2
  •  2
  •   Soner from The Ottoman Empire    7 年前

    realloc() 不只是字符或整数。它将自动释放先前的内存分配,然后重新分配请求的内存。

    会增加吗 \0 在重新分配字符串的末尾?

    这是不可能的。

    它会离开 \0个 在上一个字符串的相同位置, 在之后添加未初始化的内存 \0个 ?

    重新定位() 不覆盖旧内容,不覆盖以前的内存位置。它不触及其内容,只是移动到并重新分配新的内存块。

        3
  •  0
  •   vitalii misko    7 年前

    realloc() -更改ptr指向的内存块的大小。

    即使块移动到新位置,内存块的内容也会保留到新大小和旧大小中较小的一个。如果新大小更大,则新分配部分的值为 不确定 .

    您需要为字符串分配内存,使用 malloc() 使用前 重新定位() . scanf()将无法将内存写入空指针(字符串值)。