Ваш пример «обновления» завершен? Я бы не подумал, что это скомпилируется: он требует возвратной ценности, но вы никогда ничего не возвращаете. Вы никогда ничего не делаете, это будет полным путем, но, возможно, это преднамеренно, может быть, вы просто хотите сказать, что когда вы делаете malloc, другие вещи ломаются.
Не видя звонящего, нельзя сказать окончательно, что здесь происходит. Я предполагаю, что пути - это динамически выделенный блок, который был свободен, прежде чем вы вызывали эту функцию. В зависимости от реализации компилятора блок free'd все еще может содержать достоверные данные, пока будущий malloc не займет пространство.
Update: на самом деле ответить на этот вопрос
обработка Строки является хорошо известной проблемой в С. Если вы создаете массив фиксированного размера для хранения строки, вам не придется беспокоиться о длинной череде перелива выделенное пространство. Это означает постоянную проверку размеров строк на копиях, используя strncpy и strncat вместо простых strcpy и strcat или аналогичных методов.Вы можете пропустить это и просто сказать: «Ну, никто никогда не будет иметь имя длиннее 60 символов» или некоторые такие, но всегда есть опасность, что кто-то будет. Даже на то, что должно иметь известный размер, например, номер социального страхования или ISBN, кто-то может ошибиться, введя его и дважды нажав клавишу, или злонамеренный пользователь может ввести что-то долгое. И т.д. Конечно, это в основном проблема с вводом данных или чтением файлов. Когда у вас есть строка в поле некоторого известного размера, то для любых копий или других манипуляций вы знаете размер.
Альтернативой является использование динамически распределенных буферов, где вы можете сделать их настолько большими, насколько это необходимо. Это звучит как хорошее решение, когда вы впервые его слышите, но на практике это гигантская боль в C, потому что выделение буферов и освобождение их, когда вы больше не нуждаетесь в них, - это много неприятностей. Другой плакат здесь сказал, что функция, которая выделяет буфер, должна быть той же, которая освобождает ее. Хорошее эмпирическое правило, я вообще согласен, но ... Что делать, если подпрограмма хочет вернуть строку? Таким образом, он выделяет буфер, возвращает его и ... как он может его освободить? Это невозможно, потому что все дело в том, что он хочет вернуть его вызывающему. Вызывающий не может выделить буфер, потому что он не знает размер. Кроме того, казалось бы, простые вещи вроде:
if (strcmp(getMeSomeString(),stringIWantToCompareItTo)==0) etc
невозможно. Если функция getMeSomeString выделяет строку, уверен, она может вернуть ее, поэтому мы выполняем сравнение, но теперь мы потеряли дескриптор, и мы никогда не сможем его освободить. Вы в конечном итоге, чтобы писать неудобный код как
char* someString=getMeSomeString();
int f=strcmp(someString,stringIWantToCompareItTo);
free(someString);
if (f==0)
etc
Так хорошо, это работает, но читаемость просто plummetted.
На практике я обнаружил, что, когда строки можно разумно ожидать, что они имеют знающий размер, я выделяю буферы фиксированной длины. Если вход больше, чем буфер, я либо обрезаю его, либо выдаст сообщение об ошибке в зависимости от контекста. Я использую только динамически распределенные буферы, когда размер потенциально большой и непредсказуемый.
Я думаю, что больше похоже на то, что вы делаете то, что вызывает неопределенное поведение. Прежде чем обвинять его в компиляторе или ОС, я предлагаю вам поделиться с нами некоторым примером кода, чтобы мы могли сказать вам, действительно ли ваш исходный код, который работал с ОС X. –
Это просто выглядит ... как минимум. Вы назначаете массив (???) ... который вы хотите вставить? У вас есть returnstr, но возвращайте localstr (в стек, oops!) И т. Д. В любом случае, добро пожаловать в забавный мир C. Собственность на объекты (да, C тоже их) должна быть четко определена. Например, что произойдет, если код выше вызывается как myfunction («Hello world!») - в любом случае, определите контракты. Один из подходов состоит в том, чтобы заставить CALLER передать действительный объект, способный принимать n символов (если требуется больше вызовов, и т. Д.) – 2010-04-15 00:12:26
Я смущен относительно того, что означает «действительно строгий C». Я согласен с Майклом в том, что «действительно странное поведение», которое вы видите, - это просто неопределенное поведение, учитывая приведенный выше код. В C нет специального способа передать «строку», он работает так же, как и любой другой массив. Что именно вы делаете? –