让我先说一句,我是一个新手,我在学校的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;
}发布于 2011-02-03 23:50:08
A=(char*)malloc(sizeof(char)+1);将分配至少2个字节(sizeof(char)始终为1)。我不明白你是如何确定它分配了8个字节的,然而malloc却被允许分配比你所要求的更多的内存,而不是更少。
您可以使用scanf将较长的字符串写入A所指向的内存,但这并不意味着您已经分配了该内存。它将覆盖任何内容,这可能导致程序崩溃或产生意想不到的结果。
发布于 2011-02-03 23:51:44
malloc会根据您的要求分配内存。
如果您可以读取超过分配的字节(使用scanf),这是因为scanf也在您拥有的内存上读取:这是一个缓冲区溢出。
您应该限制scanf可以以这种方式读取的数据:
scanf( "%10s", ... ); // scanf will read a string no longer than 10发布于 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。
https://stackoverflow.com/questions/4888225
复制相似问题