让我先说一下,我是一个新手,我在学校的入门级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)
A=(char*)malloc(sizeof(char)+1);
Run Code Online (Sandbox Code Playgroud)
将分配至少2个字节(sizeof(char)始终为1).我不明白你是如何确定它分配8个字节,但是malloc被允许分配比你要求的更多的内存,只是永远不会少.
您可以使用scanf将更长的字符串写入A指向的内存这一事实并不意味着您已分配了该内存.它会覆盖那里的任何内容,这可能会导致程序崩溃或产生意外结果.
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因此实际上不需要强制转换。首先请参阅此内容。
| 归档时间: |
|
| 查看次数: |
3797 次 |
| 最近记录: |