标题可能不准确。请原谅我是一名全新的程序员。但这是一个真正的问题,我认为这会让那些在学习我的第一个低级编程语言时就像记忆和指针一样困惑的人受益,那就是C.
以下是我所知道的:
malloc
函数在内存中分配一个位置,该函数返回指向已分配内存的指针。malloc
函数将您想要存储的大小(以字节为单位)作为参数这引出了我的问题:如果你在malloc函数分配的内存中存储更大的东西,你传递一个较小的大小作为malloc函数的参数会怎么样?
当然,我做的第一件事显然是尝试一下。我使用scanf输入,然后将输入存储在分配的内存中。这是代码:
#include <stdio.h>
#include <stdlib.h>
int main(){
char *string_pointer;
string_pointer = malloc(sizeof(char)*24);
if (string_pointer == NULL){
puts("Memory allocation failed:(");
return 1;
}else{}
scanf("%s",string_pointer);
printf("%s",string_pointer);
return 0;
}
你可以看到我在内存中分配了一个位置,传入sizeof(char)*24
作为参数。然后我将这个内存的指针存储在string_pointer
变量中。
现在,如果我用超过24个字符(大于分配的内存大小)的字符串提供scanf,它仍然可以工作,当我打印出内存的内容时,我得到了整个字符串,甚至虽然这意味着它存储了一个比它能容纳的更大的字符串。这表明我对内存分配的工作方式存在明显的误解。可能是因为malloc
没有分配一个只能保存我传递给malloc的大小的内存,而整个大小参数的用途完全不同。
我完全糊涂了吗?为什么我只是将一个字符串存储在一个可以容纳小于字符串大小的内存中?