gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:11:01 24 4
gpt4 key购买 nike

我不知道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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com