Вы, кажется, указываете свой символ * указатель filename
на символьную константу. Я полагаю, вы определили #define FILENAMEINAMACRO "physio_sensor_readout.csv"
. Это делает ваше назначение filename = "physio_sensor_readout.csv";
. Затем вы используете указатель имени файла для изменения строковой константы. Вот более подходящая последовательность:
char filename[256]; // choose a size that is suitably large
...
strcpy(filename, FILENAMEINAMACRO); // also look at strncpy for safer copying
...
... manipulate the content of filename as you wish ...
Поскольку вы сделали копию строкового литерала, его изменение безопасно (если вы остаетесь в пределах заявленного размера filename
, что включает в себя сохранение любого завершающего нуля также в пределах границ.
Вы должны быть осторожны, используя форму char filename[] = "..."
. Он выделяет достаточно места для строкового литерала, который вы ему даете, но если позже вы копируете какой-то другой строковый литерал в это пространство, вы должны быть уверены, что второй литерал не длиннее первого. Более безопасная практика - измерять пространство так, чтобы оно было достаточно большим, чтобы вы были уверены, что ваш код никогда не будет пытаться использовать больше, чем то, что вы измерили. Если вы принимаете ввод извне программы (или из кода другого человека), вы должны проверить длину того, что вы принимаете, прежде чем пытаться скопировать его в пространство, которое вы измерили. Любое использование пространства сверх размерного размера может вызвать проблемы, которые трудно диагностировать. В приведенном выше примере вы должны приложить все усилия, чтобы гарантировать, что вы никогда не будете использовать больше места (включая завершающий nul символ), чем 256 символов (поскольку имя файла имеет размер 200).