c - 访问越界内存时没有段错误

标签 c segmentation-fault dynamic-arrays

我的英语不是很好。

所以在我的程序中,我想将存在于 txt 文件中的文本复制到数组中。

typedef struct Chaine
{
    char * Lachaine;
    int Taille_C;
} Chaine ;

int main (void)
{
    Chaine *Tab_Texte=NULL;
    Tab_Texte=(Chaine*)malloc(sizeof(Chaine));
    FILE* Texte= NULL;
    Texte = fopen("chaines", "r");
    fseek(Texte, 0, SEEK_END);
    Tab_Texte->Taille_C=ftell(Texte);
    fseek(Texte, 0, SEEK_SET);
    Tab_Texte->Lachaine=NULL;
    Tab_Texte->Lachaine=(char*)malloc(sizeof(char)*Tab_Texte->Taille_C);
    fread(Tab_Texte->Lachaine,sizeof(char)*(Tab_Texte->Taille_C),1,Texte);
    printf("%s",Tab_Texte->Lachaine);

return 0;
}

这里一切正常,当我改变时

Tab_Texte->Lachaine=(char*)malloc(sizeof(char)*Tab_Texte->Taille_C);

与(例如)

Tab_Texte->Lachaine=(char*)malloc(sizeof(char)*Tab_Texte->Taille_C - 10);

它总是有效,它应该向我显示段错误,因为 sizeof(char)*Tab_Texte->Taille_C - 10sizeof(char)*Tab_Texte->Taille_C 比文件中的文本要多。

你能告诉我为什么它总是有效吗?

最佳答案

您遇到的是 undefined behavior .

  • 访问超过分配的内存
  • 使用非空终止字符数组作为字符串
  • 提供无效的文件指针

所有 [any] 这些都会导致未定义的行为,副作用可能是段错误,但不能保证。

  1. 在使用返回指针之前检查fopen()是否成功
  2. 以 null 终止一个 char 数组以将其用作字符串
  3. free() 使用结束后分配的内存。
  4. 不要转换malloc()/calloc()的返回值。

关于c - 访问越界内存时没有段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27730460/

相关文章:

c - WHILE 循环中的段错误

c - 打印出指针指向的值(C编程)

c - MPI_Reduce() 程序出现段错误

c++ - 为什么使用动态数组而不是常规数组?

excel - 如何在 Excel 中将 SUM 函数与(新)动态数组一起使用

c++ - speex解码出错

c - 是否有适用于任何语言/国家/地区的 UTF-8 语言环境?

c - 为什么 GCC 会对 ARM Cortex-A9 产生非法的未对齐访问

C - 使用动态数组复制结构

计算数字之和。如果数字重复,则不要计算它