在C编程中需要有关malloc的帮助.它分配的空间比预期的多

use*_*768 4 c malloc

让我先说一下,我是一个新手,我在学校的入门级C班.

我正在编写一个程序,要求我使用malloc和malloc在所有情况下分配8倍我期望的空间.即使只是对malloc(1),它是分配8个字节而不是1,我很困惑为什么.

这是我测试过的代码.这应该只允许输入一个字符加上转义字符.相反,我可以输入8,所以它是分配8 bytes而不是1,即使我只使用一个整数,也是如此malloc().请忽略该x变量,它在实际程序中使用,但不在此测试中.:

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


int main (int argc ,char* argv[]){

    int x = 0;
    char *A = NULL;
    A=(char*)malloc(sizeof(char)+1);
    scanf("%s",A);
    printf("%s", A);
    free(A);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ine 6

 A=(char*)malloc(sizeof(char)+1);
Run Code Online (Sandbox Code Playgroud)

将分配至少2个字节(sizeof(char)始终为1).我不明白你是如何确定它分配8个字节,但是malloc被允许分配比你要求的更多的内存,只是永远不会少.

您可以使用scanf将更长的字符串写入A指向的内存这一事实并不意味着您已分配了该内存.它会覆盖那里的任何内容,这可能会导致程序崩溃或产生意外结果.

  • @ user601768:这没什么意思.当您损坏堆时,行为是未定义的. (3认同)
  • 你不知道它分配的更多.你只知道你正在涂鸦的未分配内存并没有用于任何重要的事情.然而. (3认同)

peo*_*oro 5

malloc 正在分配你所要求的内存.

如果你可以读取超过分配的字节数(使用scanf),那是因为你scanf正在读取你拥有的内存:它是一个缓冲区溢出.

你应该限制数据scanf可以这样读取:

scanf( "%10s", ... ); // scanf will read a string no longer than 10
Run Code Online (Sandbox Code Playgroud)


小智 4

我正在编写一个程序,要求我使用 malloc,而 malloc 在所有情况下分配的空间都是我期望的 8 倍。即使只是分配给 malloc(1),它也是分配 8 个字节而不是 1 个字节,我很困惑为什么。

从理论上讲,您在程序中执行操作的方式不是分配8 bytes.

您仍然可以输入 8 个字节(或任意数量的字节),因为在 C 中没有检查您仍在使用有效的写入位置。

你看到的是Undefined Behaviour,其原因是你在内存中写下了你不应该写的内容。n在使用您分配的字节后,您的代码中没有任何内容可以停止程序。

你可能Seg Fault现在得到,或者稍后得到,或者永远得不到。这是未定义的行为。仅仅因为它看起来有效,并不意味着它是正确的。

现在,您的程序确实可以分配 8 个字节而不是 1 个字节。

其原因是因为对齐

同一程序可能在不同的机器和/或不同的操作系统中分配不同的大小。

另外,由于您正在使用,C因此实际上不需要强制转换。首先请参阅此内容。