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

当我只分配[30]时,我可以访问数组元素[32]。(C),c,arrays,memory-management,C,Arrays,Memory Management,我不知道c的内部工作原理,所以这是相当混乱的。我一直在玩数组和指针,还有很多奇怪的东西正在发生,我希望有人能给我提供一个资源,解释这些东西是如何在引擎盖下工作的。我在看c编程参考资料,但找不到答案。 下面是一段代码: #include <stdio.h> #include <stdlib.h> #define PATH "/home/jack/Desktop/Cpractice/hangman.txt" int main() { FILE *file;

我不知道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;
}
#包括
#包括
#定义路径“/home/jack/Desktop/cpracce/hangman.txt”
int main()
{
文件*文件;
file=fopen(路径“r”);
INTC;
整数大小;
//char*word=(char*)malloc(0);
字符字[30];
//printf(“\t大小:%lu\n”,大小(字符));
int i=0;
而(1)
{
c=getc(文件);
如果(c==EOF)
打破
字[i]=c;
i++;
}
printf(“%s\n”,word);
printf(“I:%I\n”,I);
//免费(字);
返回0;
}
我在一个文件中有32个字符,word数组接受它们时没有任何错误,即使它们超过了大小,打印确认后,所有字符都被打印出来。
即使在gdb中运行它,我也可以“打印word[31]”。所以我的问题是,为什么数组分配了超过30个字符(30字节?)的内存,你能给我解释一下,或者让我看一本书或一篇文章,解释当你声明字符[30]时在引擎盖下发生的事情吗

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

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

malloc函数(动态分配)和静态分配使用一个系统调用:sbrk(我建议您阅读man以了解函数的具体功能)

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

可能会出现错误,因为如果在这个数组之后声明另一个数组,比如说一个名为tab2的6个字符的数组,并且在内存中,这个数组紧跟在另一个数组之后启动,当您尝试修改tab1[size+1]时,会出现分段错误,因为tab2使用了空间(甚至读取tab1[size+1])可能会导致分割错误,但有时,计算机太仁慈,让您这样做)


Wathever,我希望它很清楚,如果不是,请不要犹豫问我问题

当代码违反规则(试图在分配之外访问)时,任何事情都可能发生。今天可能“工作”,明天可能会失败。好吧,但我想了解它为什么有时工作,是什么导致它有时分配更多内存等等。发布的代码不足以证明分配了更多内存。当代码违反规则时,您预计会发生什么这正是我要寻找的答案类型,尤其是sbrk呼叫信息。非常感谢。不客气,顺便说一下,不需要强制转换malloc函数的返回;)