【问题标题】:Malloc array of characters. StringMalloc 字符数组。细绳
【发布时间】:2023-01-14 01:27:42
【问题描述】:

我知道由于 NULL 字符,为字符串分配内存分配需要 n+1。但是,问题是如果分配了 10 个字符但输入了 11 个字符的字符串怎么办?

#include <stdlib.h>
int main(){
    int n;
    char *str;
    printf("How long is your string? ");
    scanf("%d", &n);
    str = malloc(n+1);
    if (str == NULL) printf("Uh oh.\n");
    scanf("%s", str);
    printf("Your string is: %s\n", str);
}

我尝试运行该程序,但结果仍然与 n+1 相同。

【问题讨论】:

  • “如果您分配 10 个字符但输入 11 个字符的字符串”你有未定义的行为所以不要让这种情况发生。您不能相信此类程序所做的任何事情。
  • 程序询问你打算输入多长的字符串,你撒谎给它,告诉程序你只会输入 10 个字符,但实际上你输入了 11 个。那就是未定义的行为.任何事物能够发生。由于架构原因,最常见的结果是程序出现正常工作,即使不能保证行为。

标签: c string char malloc


【解决方案1】:

如果您分配了 10 个字符的 char* 但向其写入了 11 个字符,那么您正在写入尚未分配的内存。这有 undefined behavior - 它可能碰巧工作,它可能因分段错误而崩溃,并且它可能做一些完全不同的事情。简而言之 - 不要依赖它。

【讨论】:

    【解决方案2】:

    当您将 11 个字节写入 10 字节的缓冲区时,最后一个字节将越界。取决于几个因素,程序可能会崩溃,出现意外和奇怪的行为,或者可能运行得很好(即你所看到的)。换句话说,行为是未定义的。你几乎总是想避免这种情况,因为它不安全且不可预测。

    尝试向 10 字节缓冲区写入更大的字符串,例如 20 字节或 30 字节。你会看到问题开始出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2020-03-15
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多