在以下代码中:
int main(void)
{
char* a = malloc(sizeof(char));
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
printf("%s", a);
}
访问对我来说,a [0]正在从堆分配内存,而a [1]和a [2]在堆栈中。我得到以下代码的输出为 abc 。这是怎么回事,如果应该将堆栈和堆分配到两个不同的内存段,则我只能得到 a 作为输出,因为我只为一个字符分配了堆中的内存。
答案 0 :(得分:0)
您仅在堆中为char
中的一个a
分配了空间,但是您正在编写三个。另外两个不会神奇地进入堆栈;它们只是覆盖了其他一些可能很重要的值,而该值恰好在您分配的值之后。您的程序非常简单,不会在您的面前炸死,但是执行此操作仍然是未定义行为。 C没有边界检查,因此不会使您免于这个错误。