首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我需要在C编程中使用malloc的帮助。它分配的空间比预期的多

我需要在C编程中使用malloc的帮助。它分配的空间比预期的多
EN

Stack Overflow用户
提问于 2011-02-03 23:42:49
回答 9查看 4.3K关注 0票数 5

让我先说一句,我是一个新手,我在学校的C级入门班学习。

我正在写一个需要我使用malloc的程序,而malloc分配的空间是我期望的所有情况下的8倍。即使是malloc( 1 ),分配的也是8个字节,而不是1个字节,我搞不懂为什么。

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

代码语言:javascript
复制
#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;
}
EN

回答 9

Stack Overflow用户

发布于 2011-02-03 23:50:08

代码语言:javascript
复制
 A=(char*)malloc(sizeof(char)+1);

将分配至少2个字节(sizeof(char)始终为1)。我不明白你是如何确定它分配了8个字节的,然而malloc却被允许分配比你所要求的更多的内存,而不是更少。

您可以使用scanf将较长的字符串写入A所指向的内存,但这并不意味着您已经分配了该内存。它将覆盖任何内容,这可能导致程序崩溃或产生意想不到的结果。

票数 7
EN

Stack Overflow用户

发布于 2011-02-03 23:51:44

malloc会根据您的要求分配内存。

如果您可以读取超过分配的字节(使用scanf),这是因为scanf也在您拥有的内存上读取:这是一个缓冲区溢出。

您应该限制scanf可以以这种方式读取的数据:

代码语言:javascript
复制
scanf( "%10s", ... ); // scanf will read a string no longer than 10
票数 6
EN

Stack Overflow用户

发布于 2011-02-03 23:49:18

我正在写一个需要我使用

的程序,而在所有情况下,malloc分配的空间都是我期望的8倍。即使是malloc( 1 ),分配的也是8个字节,而不是1个字节,我搞不懂为什么。

从理论上讲,你在程序中做事情的方式,并不是分配8 bytes

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

你看到的是Undefined Behaviour,原因是你在内存中写了不应该写的东西,在你分配的n字节被使用后,你的代码中没有任何东西会停止程序。

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

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

这是因为Alignment

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

此外,由于您使用的是C,因此您实际上不需要强制转换。首先,请参阅this

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4888225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档