【问题标题】:Why does the malloc work without correct number of bytes allocated?为什么 malloc 在没有正确分配字节数的情况下工作?
【发布时间】:2017-05-30 15:03:52
【问题描述】:

我有一个简单的问题,我似乎无法在任何地方找到答案。

当我为两个字符分配了足够的内存时,为什么这段代码可以编译和工作,“he”、“hellos”应该无法容纳?

它打印出正确的长度,即 6。

免费的没有错误。

char* testF() {
    char *arr = (char*)malloc(2*sizeof(char));
    strcpy(arr, "hellos");
    return arr;
}

int main() {
    char *arr = testF();
    printf("%c%c%c%c%c%c\n", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]);
    printf("Length = %d", strlen(arr));
    free(arr);

    return 0;
}

【问题讨论】:

  • 它没有。这是 UB。
  • here
  • UB是什么意思?
  • 你很幸运(如果在某些情况下你认为你的代码没有错误,那么你就很不幸)。在许多情况下,程序会崩溃/出现分段错误。
  • @Lurr 未定义行为

标签: c string malloc c-strings


【解决方案1】:

您没有出错的唯一原因是您复制的数据量仍然可以容纳在内存页面中。如果您不小心复制导致页面溢出的数据,您会收到 SIGSEGV(分段)错误。

总之,这是未定义的行为。

【讨论】:

    【解决方案2】:

    如果在 malloc 分配的区域之后有空闲内存,就会发生这种情况。

    当然,您必须依靠它。只相信你分配的东西。

    实际上,这是令人讨厌的错误的来源,因为一些糟糕的代码(例如 mallocing 内存不足或使用释放的内存)可以正常工作。然后有一天你做了一个影响内存方案的小改动,或者更新了编译器版本,事情就开始崩溃了......

    【讨论】:

    • 所以基本上,如果我在一个更大的程序中不走运,我在内存上写了其余的东西,“hellos”的“llos”被保存,我访问它时会崩溃吗?还是价值观不好? @designerman
    • 如果你运气够差,一时间不会出现崩溃,等你改了东西之后,就会出现……
    【解决方案3】:

    为什么当我为两个字符“he”、“hellos”分配了足够的内存时,这段代码无法编译和工作?

    这是undefined behaviour,因为strcpy() 调用溢出了缓冲区。

    C 标准不需要实现就未定义 行为给出错误或警告。所以,你不能指望有什么能拯救你;你是一个人。

    【讨论】:

    • 我应该把 malloc 改成 char *arr = (char)malloc(6*sizeof(char));或 char *arr = (char)malloc(7*sizeof(char));妥善保存?
    • 它必须是7 字节,包括空字节终止。所以,后者。您还应该检查malloc() 的返回值是否失败:if (arr == NULL) { perror("malloc"); exit(EXIT_FAILURE);}
    • @Lurr *arr = malloc(7 * sizeof(*arr)); 现在可能是最好的选择。感谢您指出这一点。
    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 2015-07-20
    • 2019-02-24
    • 2013-08-25
    • 2016-04-06
    • 2017-09-23
    • 2020-03-07
    • 1970-01-01
    相关资源
    最近更新 更多