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

时间:2012-05-07 23:27:32

标签: 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)
{
    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);
}

4 个答案:

答案 0 :(得分:2)

dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);
memset(dataToWrite,0,strlen(dataToWrite));

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

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

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

抛弃刚刚分配的内存。

答案 1 :(得分:1)

嗯,这突然袭击了我:

dataToWrite=(char *)malloc(sizeof(fileData));
memset(dataToWrite,0,strlen(dataToWrite));

您在strlen上呼叫char*,指向刚刚分配了malloc的内存。你不知道那块内存会是什么,但你会在返回之前调用strlen寻找一个空字符。你的memset错了,可能在任何地方写字,导致内存损坏。

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

答案 2 :(得分:0)

dataToWrite=(char *)malloc(strlen(strcat(fileToReadFrom," does not exists!!"))+1);

您已将字符串复制到fileToReadFrom;你是否相信它足够大以处理额外的字符串数据以及它具有的文件名? (为什么这必须在这里发生?不要试图在一行中做太多。)

我怀疑你是否误解了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)并审核每个的正确性。您可能在程序的其余部分中存在可利用的安全漏洞。

答案 3 :(得分:0)

您的代码中存在许多问题。

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足够大)。