在C中释放指针时显示的垃圾值

在C中释放指针时显示的垃圾值,c,pointers,C,Pointers,当我试图释放dataToWrite时,我不确定为什么会在if循环中抛出垃圾值。它在else循环中运行良好。 有人能帮我吗 FILE *readFilePointer = NULL; Message_buf outputMsgBuffer; char fileData[PIPE_BUF]; char *dataToWrite=NULL; readFilePointer = fopen(fileToReadFrom, "r"); if (readFilePointer == NULL) {

当我试图释放dataToWrite时,我不确定为什么会在if循环中抛出垃圾值。它在else循环中运行良好。 有人能帮我吗

FILE *readFilePointer = NULL;
Message_buf outputMsgBuffer;
char fileData[PIPE_BUF];
char *dataToWrite=NULL;

readFilePointer = fopen(fileToReadFrom, "r");

if (readFilePointer == NULL)
{
    outputMsgBuffer.messageType=1;
    dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
    memset(dataToWrite,0,strlen(dataToWrite));
    dataToWrite=strcat(fileToReadFrom," does not exists!!");
    strcat(outputMsgBuffer.messageText,dataToWrite);
    memset(dataToWrite,0,strlen(dataToWrite)+1);
    free(dataToWrite);
}
else
{   
    //outputMsgBuffer.messageText[0] = '\0';
    while (fgets(fileData, sizeof(fileData), readFilePointer) != NULL)
    {
        dataToWrite=(char *)malloc(sizeof(fileData));
        memset(dataToWrite,0,strlen(dataToWrite));
        strcpy(dataToWrite,fileData);
        strcat(outputMsgBuffer.messageText,dataToWrite);    
        free(dataToWrite);
    }

    fclose(readFilePointer);
}
outputMsgBuffer.messageType=1;
outputMsgBuffer.messageLength=strlen(outputMsgBuffer.messageText);
mesg_send(fd,&outputMsgBuffer);
}
您没有初始化分配的内存,因此在
dataToWrite
上调用
strlen
会调用未定义的行为

另外,您似乎没有意识到这样一个事实,
strcat
修改第一个参数指向的内存,并返回指向它的指针

dataToWrite=strcat(fileToReadFrom," does not exists!!");
丢弃刚刚分配的内存

您没有初始化分配的内存,因此在
dataToWrite
上调用
strlen
会调用未定义的行为

另外,您似乎没有意识到这样一个事实,
strcat
修改第一个参数指向的内存,并返回指向它的指针

dataToWrite=strcat(fileToReadFrom," does not exists!!");

扔掉刚刚分配的内存。

好吧,我突然想到:

dataToWrite=(char *)malloc(sizeof(fileData));
memset(dataToWrite,0,strlen(dataToWrite));
您正在调用
strlen
char*
指向您刚才用
malloc
分配的内存。你不知道那块内存中会有什么,但是你调用
strlen
,它在返回之前寻找一个空字符。您的
memset
错误,可能在任何地方写入,导致内存损坏


另一方面,不要在C中强制转换malloc的返回值。这完全没有必要,而且实际上可以隐藏您忘记包含stdlib.h的事实(在标准的较旧版本中)。好吧,这让我吃惊:

dataToWrite=(char *)malloc(sizeof(fileData));
memset(dataToWrite,0,strlen(dataToWrite));
dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
您正在调用
strlen
char*
指向您刚才用
malloc
分配的内存。你不知道那块内存中会有什么,但是你调用
strlen
,它在返回之前寻找一个空字符。您的
memset
错误,可能在任何地方写入,导致内存损坏

另一方面,不要在C中强制转换malloc的返回值。这是完全不必要的,实际上可以隐藏您忘记包含stdlib.h的事实(在标准的旧版本中)

dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
您已将一个字符串复制到
文件中,以从
读取;您确信它足够大,可以处理文件名之外的额外字符串数据吗?(为什么会发生这种情况?不要试图在一行中做太多。)

我怀疑你误解了strcat(3)
的工作原理;再看看原型:

   char *strcat(char *dest, const char *src);
dest
是目的地:

dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
memset(dataToWrite,0,strlen(dataToWrite));
dataToWrite=strcat(fileToReadFrom," does not exists!!");
假设
fileToReadFrom
包含
hello
。在此代码之后,
dataToWrite
包含:

hello does not exists!! does not exists!!
如果
fileToReadFrom
不够大,那么您已经在大量不相关的内存上涂鸦了

我强烈建议您在程序中查找strcpy(3)
的每一个用法,并审核每一个用法的正确性。程序的其余部分可能存在可利用的安全漏洞

您已将一个字符串复制到
文件中,以从
读取;您确信它足够大,可以处理文件名之外的额外字符串数据吗?(为什么会发生这种情况?不要试图在一行中做太多。)

我怀疑你误解了strcat(3)
的工作原理;再看看原型:

   char *strcat(char *dest, const char *src);
dest
是目的地:

dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
memset(dataToWrite,0,strlen(dataToWrite));
dataToWrite=strcat(fileToReadFrom," does not exists!!");
假设
fileToReadFrom
包含
hello
。在此代码之后,
dataToWrite
包含:

hello does not exists!! does not exists!!
如果
fileToReadFrom
不够大,那么您已经在大量不相关的内存上涂鸦了


我强烈建议您在程序中查找strcpy(3)
的每一个用法,并审核每一个用法的正确性。程序的其余部分可能存在可利用的安全漏洞。

代码中存在许多问题

dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
您确定fileToReadFrom有足够的空间吗

dataToWrite=strcat(fileToReadFrom," does not exists!!");
再说一遍,你确定吗。。。然后覆盖指向新分配内存的指针

free(dataToWrite);
dataToWrite不再包含来自malloc的指针

strcat(outputMsgBuffer.messageText,dataToWrite);
您确定outputMsgBuffer.messageText有足够的空间吗?如果是,为什么要为另一个指针分配内存(也在else中)

您可能想要的是:

strcpy(outputMsgBuffer.messageText,fileToReadFrom); 
strcat(outputMsgBuffer.messageText," does not exists!!");
在另一个世界里呢

strcpy(outputMsgBuffer.messageText,fileData); 

没有其他内容(如果您确定outputMsgBuffer.messageText足够大)。

代码中存在许多问题

dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
您确定fileToReadFrom有足够的空间吗

dataToWrite=strcat(fileToReadFrom," does not exists!!");
再说一遍,你确定吗。。。然后覆盖指向新分配内存的指针

free(dataToWrite);
dataToWrite不再包含来自malloc的指针

strcat(outputMsgBuffer.messageText,dataToWrite);
您确定outputMsgBuffer.messageText有足够的空间吗?如果是,为什么要为另一个指针分配内存(也在else中)

您可能想要的是:

strcpy(outputMsgBuffer.messageText,fileToReadFrom); 
strcat(outputMsgBuffer.messageText," does not exists!!");
在另一个世界里呢

strcpy(outputMsgBuffer.messageText,fileData); 

没有其他内容(如果您确定outputMsgBuffer.messageText足够大)。

欢迎使用堆栈溢出!让陌生人通过检查来发现代码中的错误是没有效果的。您应该使用调试器或打印语句来识别(或至少隔离)问题,然后返回一个更具体的问题(一旦您将问题缩小到10行)。什么符号是垃圾。它是如何“抛出”的?什么是“if循环”?我完全同意Oli的观点,但是,我碰巧注意到您在dataToWrite()上误用strcat.strlen是不好的-您不知道它的内容是什么-可能会导致UMRWelcome堆栈溢出!让陌生人通过检查来发现代码中的错误是没有效果的。您应该使用调试器或打印语句来识别(或至少隔离)问题,然后返回一个更具体的问题(一旦您将问题缩小到10行)。什么符号是垃圾。它是如何“抛出”的?什么是“if循环”?我完全同意Oli的观点,但是,我碰巧注意到您在dataToWrite()上误用strcat.strlen是不好的-您不知道它的内容是什么-co