c - 当我只分配 [30] 时,我可以访问数组元素 [32]。(C)

标签 c arrays memory-management

我不知道c的内部工作原理,所以这很令人困惑。我一直在使用数组和指针,并且发生了很多奇怪的事情,我希望有人能给我指出一个资源,解释这些东西在幕后是如何工作的。我正在查看 C 编程引用,但找不到答案。 所以这是一段代码:

#include <stdio.h>
#include <stdlib.h>
#define PATH "/home/jack/Desktop/Cpractice/hangman.txt"

int main()
{
    FILE *file;
    file = fopen(PATH, "r");
    int c;
    int size;
    //char *word = (char *)malloc(0);
    char word[30]; 
    //printf("\tSize: %lu\n",sizeof(char));
    int i =0;
    while(1)
    {
        c = getc(file);
        if(c == EOF)
            break;
        word[i] = c;
        i++;
    }
    printf("%s\n", word);
    printf("I: %i\n", i);
    //free(word);

    return 0;
}

我的文件中有 32 个字符,单词数组接受它们而没有任何错误,即使它们超出了大小,打印也确认了这一点,所有字符都被打印。 即使在 gdb 中运行它,我也可以“打印 word[31]”。所以我的问题是,为什么数组分配超过 30 个字符(30 字节?)的内存,您能否解释一下或给我指出一本书或一篇文章,解释当您声明 char[30] 时会发生什么?

最佳答案

这是我的第一条评论,所以我会尽量说得清楚。

简而言之,C 语言中的内存有点特殊,但在深入研究主题之前并不复杂。

malloc函数(动态分配)和静态分配使用系统调用:sbrk(我建议你阅读man以了解该函数到底做了什么) https://linux.die.net/man/2/sbrk

你的问题是“为什么我可以读取tab[size + 1]”,这是因为分配给你的数组的内存不仅仅是大小,事实上,如果后面有空闲空间,你就可以访问它,但要小心,因为这可能会在一段时间后导致你的程序出现一些错误......

可能会出现错误,因为如果您在此数组之后声明另一个数组,假设有一个名为 tab2 的 6 个字符的数组,并且在内存中,当您尝试修改 tab1[size + 1 时,该数组就在另一个数组之后开始] 你会遇到段错误,因为该空间被 tab2 使用(即使读取 tab1[size + 1] 也可能导致段错误,但有时,计算机太仁慈了,让你这样做)

无论如何,我希望它很清楚,如果不是,请随时问我问题!

关于c - 当我只分配 [30] 时,我可以访问数组元素 [32]。(C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40791990/

相关文章:

c - getopt() 解析模式不起作用

javascript - 对数组中的值求和 - Javascript

c# - 通过字节数组转换发送图像,从 java 到 c#

c - 使用大量内存的堆实现 - C

c - sys/mman.h 的 Windows 等价物

c - 显示 C 文件中的所有函数

c - 应用malloc

c++ - 交换数组中的 2 个项目,但不通过引用传递它

c++ - 为什么在这个函数中分配内存需要一个指向指针的指针?

c - 在 C 中返回字符串时管理内存