0

この小さなプログラムをコンパイルして実行し、文字列を反転すると、出力が発生する前にセグメンテーション違反が発生します。これが明白な質問である場合はご容赦ください。私はまだ C に非常に慣れていません。

#include <stdio.h>

int reverse(char string[], int length); 

int main() {
char string[] = "reversed";

  printf("String at start of main = %s", string);
  reverse(string, sizeof(string));
  printf("%s\n", string);

return 0;

}

// Reverse string 
int reverse(char string[], int length) {
 int i;
 char reversed[] = {};
 int temp;

 for(i = 0; i < length; ++i) {
 temp = string[i];
 reversed[length - i] = temp;

 }
 return 0; 
}
4

4 に答える 4

6

このため:

まず、要素がゼロの配列を作成します。

char reversed[] = {};

そして後で、その境界を超えてその配列に書き込もうとします。

reversed[length - i] = temp;

アップデート:

上記は、サイズが実行時にのみわかっているメモリを割り当てる必要があることを意味します (それは ですlength)。これを行う通常の C スタイルの方法は...呼び出し元にメモリ割り当ての負担を押し付けることです。

int reverse(const char* string, char* destination, int length);

この関数は、呼び出し元によって提供されたバッファーに書き込みます。呼び出し元は、次のことも確認する必要があります。

  1. バッファは十分な大きさです
  2. バッファのメモリは、必要なときに解放されます
于 2010-05-13T20:34:21.770 に答える
3

この場合は機能しますが、通常、sizeof(string) は `strlen(string) にする必要があります。通常、char ポインターを使用する場合、sizeof 演算子は、配列全体ではなく、1 つのポインターのサイズのみを返します。. reverse() では、逆配列は割り当てられません。次のように割り当てることができます。

char* reversed = (char*) malloc( length+1 );

文字列の末尾にあるヌル文字を考慮して、長さに 1 を追加します。

于 2010-05-13T20:38:25.960 に答える
1

コードは C としてコンパイルできません。宣言

char reversed[] = {};

無効です。C 言語には空のイニシャライザなどはありません{}(C++ にのみ存在します)。さらに、空の初期化子は、サイズが指定されていない配列宣言では意味がありません (これにより、このコードは C++ としてもコンパイルできなくなります)。これは、C にも C++ にもサイズがゼロの配列などがないためです。

実際のコードを投稿するか、これが C++ であると思われる場合は質問にタグを付け直してください。

于 2010-05-13T20:39:02.050 に答える
0

C では、変数と配列が使用するメモリについて慎重に考える必要があります。

あなたが書くとき、char reversed[] = {}あなたは真新しいゼロサイズの配列を作成しています。(これは明らかに厳密に正しい C ではありませんが、質問者の gcc コンパイラで起こっていることです。結局のところ、報告はコンパイル時の構文エラーではなく、実行時のセグメンテーション違反です。)

次に、ステートメントは、サイズがないreversed[length - i]ため、スペースがない配列の要素にデータを書き込もうとします。reversed

次の 2 つのオプションがあります。

  • reversed適切なサイズの配列を作成し(おそらくmalloc@Bob Kaufman のように使用して) reverse()functionから返します。
  • 文字列内で文字をシフトすることにより、文字列を「その場で」逆にしますstring

文字列をその場で逆にすることが望ましい可能性があります。メモリを動的に割り当てる場合は、メモリを再度解放することを心配する必要があり、面倒な場合があります。

于 2010-05-13T20:41:09.150 に答える