これは私が持っている構造です
typedef struct {
int startIndex;
int length;
char *rawString;
}Tokenizer;
文字列をコピーする関数を取得しました(スペースを削除します)
void copyStringWithoutSpace(char *source,char *destination )
{
int i =0 ,j=0;
destination = malloc (sizeof(char)*strlen(source));
for(i=0;i<strlen(source);i++)
{
if(!(source[i]==' ')||(source[i]=='\t'))
{
destination[j] =source[i];
j++;
}
}
destination[j]='\0';
}
そしてこれはcopyStringWithoutSpaceを呼び出す関数です
Tokenizer *initTokenizer(char *expression)
{
int i =0, j=0;
Tokenizer *newTokenizer = malloc (sizeof(Tokenizer));
copyStringWithoutSpace(expression, newTokenizer->rawString);
newTokenizer ->startIndex =0;
newTokenizer ->length =strlen(newTokenizer->rawString);
return newTokenizer;
}
今、このコードは悪いメモリアクセスを返します。私は長い間トラブルシューティングを行っていて、解決できません。誰かが私を助けたいですか?
C文字列はNULL文字で終了し、この文字はによって考慮されないことに注意してください。つまりstrlen
、メモリ内のサイズは実際にはstrlen(source) + 1
です。
あなたがする必要があるのはこのようにあなたのバッファを割り当てることです:
destination = malloc (strlen(source) + 1);
sizeof(char)
C規格では1であることが保証されているので、安全に省略できます。
また、関数destination
内の変数の値を変更してcopyStringWithoutSpace
いるため、新しく割り当てられたメモリは関数の外部からは見えなくなり、メモリリークが発生します。
ポインタを返し、次の署名を付ける必要があります。
char * copyStringWithoutSpace(char *source)
または代わりに:
void copyStringWithoutSpace(char *source, char ** destination)
ここで、次のようにメモリを割り当てる必要があります。
*destination = malloc (strlen(source) + 1);
ここでの別のエラーはこれです: if(!(source[i]==' ')||(source[i]=='\t'))
演算子の優先順位のため、これはあなたが望むことをしません。ここで、否定演算子は次の括弧のペアにのみ適用されます。つまり、テストは次のように綴ることができます。
source [i]がスペースでない場合、またはsource [i]が表である場合
あなたはそれをこのように書くべきでした:
if (source[i] != ' ' && source[i] != '\t')
どちらがはるかに明確ですよね?
また、コメントで指摘されているように、strlen
文字列全体をNULL文字まで繰り返す必要があるため、各反復での呼び出しは非常に非効率的です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加