动态字符数组

Dynamic char array

正在尝试分配 N 个元素的字符数组。

#include <stdio.h>
#include <malloc.h>

int main()
{
     int N = 2;

     char *array = malloc(N * sizeof(char)); 

     array[0] = 'a';
     array[1] = 'b';
     array[2] = 'c';    // why can i do that??

     printf("%c", array[0]);
     printf("%c", array[1]);
     printf("%c", array[2]);  //shouldn't I get a seg fault here??

     return 0;
 }

问题是:

由于我分配了 2 * 1 = 2 个字节的内存,这意味着我的数组中可以有 2 个字符。我怎么可能有更多??我还打印了 sizeof(*array) 并且它打印了 8 个字节。我在这里错过了什么?

当程序试图访问操作系统尚未映射到其虚拟内存地址的内存地址时,会发生分段错误space。

内存分配以页面为单位(通常为 4k 或 8k,但您也可以获得更大的页面)。因此 malloc() 调用从 OS 获取一个内存页,并为数组分割出一部分,returns 指向它的指针。在这种特定情况下,在您的数组之后仍然有很大一部分页面剩余(未分配但已可用于后续调用 malloc()) - array[2] 引用页面内的有效地址,因此没有分段错误.

但是,您正在访问数组之外​​的内存,正如评论中所提到的,这是未定义的行为,并且可能会通过覆盖不相关变量的值而导致较大程序中的内存损坏。

第 0 个和第 1 个元素在有效的内存分配范围内。使用第二个元素,您侵入了未分配的内存。会很好地工作,直到那部分内存被分配给其他东西,然后你的第二个元素将开始有疯狂的价值。你的代码会发疯。但正如@jon 指出的那样,编译器应该会捕捉到这一点,除非你要求它关闭