ここの多くの人がstrcpyについて不満を言っていることは理解していますが、私が抱えている問題に対処する検索を使用したものは見つかりませんでした。
まず、strcpy自体を呼び出しても、クラッシュ/セグメンテーション違反自体は発生しません。次に、コードは関数内に含まれており、この関数を初めて呼び出すと、完全に機能します。クラッシュするのは2回目だけです。
私はLPC1788マイクロコントローラーでプログラミングしています。メモリはかなり限られているので、mallocのようなものが失敗する理由はわかりますが、解放されません。
関数trimMessage()にはコードが含まれており、関数の目的は、大きな文字列配列が大きくなりすぎた場合にその一部を削除することです。
void trimMessage()
{
int trimIndex;
// currMessage is a globally declared char array that has already been malloc'd
// and written to.
size_t msgSize = strlen(currMessage);
// Iterate through the array and find the first newline character. Everything
// from the start of the array to this character represents the oldest 'message'
// in the array, to be got rid of.
for(int i=0; i < msgSize; i++)
{
if(currMessage[i] == '\n')
{
trimIndex = i;
break;
}
}
// e.g.: "\fProgram started\r\nHow are you?\r".
char *trimMessage = (char*)malloc((msgSize - trimIndex - 1) * sizeof(char));
trimMessage[0] = '\f';
// trimTimes = the number of times this function has been called and fully executed.
// freeing memory just below is non-sensical, but it works without crashing.
//if(trimTimes == 1) { printf("This was called!\n"); free(trimMessage); }
strcpy(&trimMessage[1], &currMessage[trimIndex+1]);
// The following line will cause the program to crash.
if(trimTimes == 1) free(trimMessage);
printf("trimMessage: >%s<\n", trimMessage);
// Frees up the memory allocated to currMessage from last iteration
// before assigning new memory.
free(currMessage);
currMessage = malloc((msgSize - trimIndex + 1) * sizeof(char));
for(int i=0; i < msgSize - trimIndex; i++)
{
currMessage[i] = trimMessage[i];
}
currMessage[msgSize - trimIndex] = '\0';
free(trimMessage);
trimMessage = NULL;
messageCount--;
trimTimes++;
}
助けてくれた皆さん、ありがとうございました。関数が正しく機能するようになりました。解放したばかりの配列を印刷しようとした理由を尋ねる人には、strcpyの後に問題が発生したことを示し、その後に続く他のコードを除外するためにそこにありました。
同様の問題に遭遇した人に役立つことがわかった場合に備えて、最終的なコードはここにあります。
void trimMessage()
{
int trimIndex;
size_t msgSize = strlen(currMessage);
char *newline = strchr(currMessage, '\n');
if (!newline) return;
trimIndex = newline - currMessage;
// e.g.: "\fProgram started\r\nHow are you?\r".
char *trimMessage = malloc(msgSize - trimIndex + 1);
trimMessage[0] = '\f';
strcpy(&trimMessage[1], &currMessage[trimIndex+1]);
trimMessage[msgSize - trimIndex] = '\0';
// Frees up the memory allocated to currMessage from last iteration
// before assigning new memory.
free(currMessage);
currMessage = malloc(msgSize - trimIndex + 1);
for(int i=0; i < msgSize - trimIndex; i++)
{
currMessage[i] = trimMessage[i];
}
currMessage[msgSize - trimIndex] = '\0';
free(trimMessage);
messageCount--;
}