Pipe 的写入覆盖了已分配的 space 内存

Pipe's write overwrites an allocated space of memory

我的程序很大,所以我会突出主要问题并添加一些相关细节。

我的代码的第一部分:

int myPipe[2]; //A global variable, so I don't have to pass it to future functions

int main(int argc, char *args[]) 
{
    mode_t pUmask = umask(0000); //Obsolete variable to my problem
    errno = 0; //Obsolete variable to my problem
    char pattern[2500] = "Test1"; //Obsolete variable to my problem
    int p = 0;              //DEFAULT NUMBER OF PROCESSES
    int deep = 0; //Obsolete variable to my problem
    int n = 1; //Obsolete variable to my problem

    if(pipe(myPipe))
    {
        perror("Pipe Error: ");
        exit(-1);
    }
    
    if( (write(myPipe[1], &p, (sizeof(int)*3))) == -1) //First write works
    {
        perror("write: ");
        exit(-1);
    }
    //Then a bunch of code releated to file reading
}

第二部分:

{
    //in another function
    //The part where I create fileName
    char* fileName = calloc(strlen(fileData->d_name)+4, sizeof(char));
    strcpy(fileName, fileData->d_name);
}

第三部分:

//in another another function
if(S_ISREG(data.st_mode))
{
    printf("\tfileName: %s\n", fileName); //Regular print of the right fileName
    printf("\t\tOh boy! It's a regular.\n");
    printf("\tfileName: %s\n", fileName); //Regular print of the right fileName

    if((read(myPipe[0], &p, (sizeof(int)*3))) == -1) //First time I read
    {
        perror("\t\t read: ");
        exit(-1);
    } 
    printf("fileName: %s", fileName); //SEGMENTATION FAULT

中间有一堆代码,但它根本不影响文件名(事实上,直到“读取”,文件名被完美打印),然后发生了分段错误。

在某一时刻,通过更改 printfs 位置,我能够在读取后获得文件名,这基本上是文件名值(“File1”)后跟 p 整数值(0),这创建了新的损坏文件文件名("File10").

发生了什么事?我为 fileName 保留了 space,我将 fileName 指针传递给以下函数直到读取,并且 fd 应该也有它自己的地址 space。帮助。

P.s。如果你需要更多信息,我愿意给你,甚至是完整的代码,但它真的很复杂,我想我给了你足够的证据证明文件名在读取部分之前根本不会被破坏,谢谢.

P.p.s。 我从不关闭任何一个“MyPipe”极端,因为我必须多次使用它们,所以我想在程序结束时关闭它们。

写入和读取管道的语句导致未定义的行为。 p 声明:

int p;

但是当你通过管道写入和读取它时,你使用 sizeof(int)*3,所以你在对象外部访问。

将这些语句更改为仅使用 sizeof p