当我只分配[30]时,我可以访问数组元素[32]。(C)
我不知道c的内部工作原理,所以这是相当混乱的。我一直在玩数组和指针,还有很多奇怪的东西正在发生,我希望有人能给我提供一个资源,解释这些东西是如何在引擎盖下工作的。我在看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;
#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函数的返回;)