c - 为什么我的 char 数组没有产生越界错误?我故意分配了不足的内存,但我仍然可以分配更大的字符串

标签 c arrays string memory malloc

我的理解是,如果 char *my_word 分配了一个字节的内存 malloc(1),那么从技术上讲,下面的代码将产生越界错误

char *my_word = malloc(1);

my_word[0] = 'y';
my_word[1] = 'e';
my_word[2] = 's';

但是,代码运行得很好并且不会产生任何错误。事实上, printf("%s", my_word) 可以很好地打印该单词。

如果我专门只分配了 1 个字节的内存,为什么不会产生越界错误?

最佳答案

C 没有明确的边界检查。这就是它变得快速的部分原因。但是,当您写入超出分配的内存范围时,您会调用 undefined behavior .

一旦调用未定义的行为,您就无法可靠地预测程序将做什么。它可能会崩溃,可能会输出奇怪的结果,或者(如在本例中)它可能看起来工作正常。此外,进行看似无关的更改(例如添加 printf 调用以进行调试或添加未使用的局部变量)可能会改变未定义行为的表现方式。

仅仅因为程序可能崩溃并不意味着它崩溃。

关于c - 为什么我的 char 数组没有产生越界错误?我故意分配了不足的内存,但我仍然可以分配更大的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59315624/

相关文章:

c - "const"有成本吗?

c - 如何让do while循环正常工作?

c - 错误 : undeclared here (not in a function)

arrays - groupby() 在 julia 中使用两个数组?

java - 字符串拆分为字符串数组

c++ - 矩阵转置缓存优化

javascript - PhotoSwipe:编辑 parseThumbnailElements 函数以解析附加标记元素

Java,在任何方向循环遍历二维数组

swift - 为什么 Swift String.Index 的索引值比实际值大 4 倍?

ruby - 使用正则表达式将数字更改为字符