2012-05-07 4 views
0

Я не уверен, почему значение мусора выбрасывается в цикле if, когда я пытаюсь освободить dataToWrite. Он отлично работает в другом цикле. Может ли кто-нибудь помочь мне с этим?Значение мусора отображается при освобождении указателя в C

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); 
} 
+2

Добро пожаловать в переполнение стека! Просить незнакомых людей обнаружить ошибки в вашем коде путем проверки неэффективно. Вы должны идентифицировать (или, по крайней мере, изолировать) проблему, используя отладчик или операторы печати, а затем вернуться с более конкретным вопросом (как только вы сузили его до 10-строчного [тестового случая] (http://sscce.org)). –

+0

какой символ мусор. Как это «брошено»? Что такое «цикл if»? –

+0

Я полностью согласен с Оли, однако, я случайно заметил, что вы злоупотребляете strcat. – Corbin

ответ

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!!"); 

выбрасывает только что выделенную память.

+0

+1 Я даже не видел вызов 'strcat', перестал читать при плохом' strlen' в вызове на 'memset'. –

1

Ну, это выскакивает у меня:

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

Вы звоните strlen на char*, что указывает на память просто наделенного malloc. Вы не представляете, что будет в этом куске памяти, но вы вызываете strlen, который ищет нулевой символ перед возвратом. Ваш memset ошибочен и может записываться в любом месте, что приводит к повреждению памяти.

На стороне записки, не отбрасывает возвращаемое значение таНоса в C. Это совершенно ненужное и может фактически скрыть факт (в более ранних версиях стандарта), что вы забыли включить stdlib.h

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) в вашей программе и аудит каждого для правильности. В остальной части программы могут существовать уязвимости безопасности.

0

В вашем коде есть много проблем.

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

Вы уверены, что файлToReadFrom имеет достаточно места?

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

еще раз, вы уверены? ... то вы перезаписать указатель на новую выделенную память

free(dataToWrite); 

dataToWrite не содержит указатель из таНос больше.

strcat(outputMsgBuffer.messageText,dataToWrite); 

Вы уверены, что outputMsgBuffer.messageText имеет достаточно места? если да, то почему вы выделяете память для другого указателя (в другом тоже)?

То, что вы, вероятно, хотите есть:

strcpy(outputMsgBuffer.messageText,fileToReadFrom); 
strcat(outputMsgBuffer.messageText," does not exists!!"); 

и в еще

strcpy(outputMsgBuffer.messageText,fileData); 

и больше ничего (если вы уверены, что outputMsgBuffer.messageText достаточно велик).