代码之家  ›  专栏  ›  技术社区  ›  Aidan

为什么在将最后一个索引分配给空终止符(\0)后,我无法释放char缓冲区

  •  1
  • Aidan  · 技术社区  · 3 月前

    我只是不明白为什么这总是给我一个错误。

    如果我只是在中读取文件,没有将最后一个索引分配给空终止符,我可以在使用后释放内存。但是,如果我确实将最后一次索引分配给了空终止符并在使用后尝试释放数据,我会遇到错误。

    char *readFileToString(const char *file)
    {
        char * buffer = 0;
        long length;
        FILE * f = fopen (file, "rb");
    
        if(f == NULL) 
            printf("ERROR::FILE:FILE_NOT_SUCCESFULLY_READ\n");
    
        fseek (f, 0, SEEK_END);
        length = ftell (f);
        fseek (f, 0, SEEK_SET);
        buffer = malloc (length);
        if(buffer == NULL) printf("Error alocating buffer memory");
        fread (buffer, 1, length, f);
        fclose (f);
        buffer[length] = '\0'; // Offending line <------------------ code works if we don't do this
    
        return buffer;
    }
    
    int main()
    {
        char *t = readFileToString("test");
        printf("%s", t);
    
        free(t); // ERROR IF WE CHANGE LAST BUFFER CHARACTER TO null terminator
    }
    
    1 回复  |  直到 3 月前
        1
  •  5
  •   0___________    3 月前

    数组的索引来源于 0 用C语言。

    • 指标的有效范围: [0, length -1]

    buffer[length] = 0; 当您访问数组边界之外的元素时,调用未定义的行为。

    附注:

    您的支票:

    if(buffer == NULL) printf("Error alocating buffer memory");
    

    不会阻止访问 NULL 指针。您需要更改程序流程

    if(buffer == NULL) 
    {
      printf("Error alocating buffer memory");
      return NULL;
    }