当我尝试释放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);
}
答案 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足够大)。