スペースなしで文字列をコピーしているときにメモリアクセスが正しくありません

ジンウェン

これは私が持っている構造です

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]

編集
0

コメントを追加

0

関連記事

分類Dev

Git:致命的:リモートリポジトリから読み取ることができませんでした。正しいアクセス権があり、リポジトリが存在することを確認してください

分類Dev

docker pythonを使用した後、ubuntuを正しく再起動できません「デバイスにスペースが残っていません」、周辺機器で使用可能なメモリがありません

分類Dev

VSTSGITに接続しているソースツリーがリモートリポジトリから読み取れませんでした。正しいアクセス権があることを確認してください

分類Dev

Goで簡単なスクリプトを書き込もうとしていますが、インタプリタが正しくありません:アクセスが拒否されましたエラー

分類Dev

NoSuchElementException:メッセージ:そのような要素はありません:SeleniumとPythonを使用して上位20のホルダーをスクレイピングしているときに要素エラーを見つけることができません

分類Dev

dbExecute()を介して中国語をMySQLに挿入しようとすると、「ステートメントを実行できませんでした:文字列値が正しくありません:」エラーが発生します

分類Dev

致命的:リモートリポジトリから読み取ることができませんでした。正しいアクセス権があることを確認してください

分類Dev

ある数値を別の配列にコピーしようとしていますが、「インデックスが配列の範囲外でした」というメッセージが表示され続け、理由がわかりません。

分類Dev

メモリを割り当てることができません:fork:awsで新しいプロセスをフォークできません

分類Dev

行をコピーして結果ステップをSQLステップ条件にコピーすることにより、メモリに格納されているパラメータを渡すことができません

分類Dev

DockerでVaultを実行しているときにVaultUIにアクセスできません:404ページが見つかりません

分類Dev

メールアドレスをスクレイピングしている間、不要なものを取り除くことはできません

分類Dev

リリースモードでアプリをビルドできません-キーストアが改ざんされているか、パスワードが正しくありません

分類Dev

Windowsバッチを使用して長い文字列をクリップボードにコピーすると、「コマンドの構文が正しくありません」というエラーが発生します

分類Dev

ASTの式のサイズがメンバーアクセスに対して正しくありません

分類Dev

必須パラメーターがありません:ionic2でgoogleトークンにアクセスしているときにgrant_type

分類Dev

cp file user @ remove構文を使用して、ssh経由でファイルをコピーするときに、「cp: 'user @ remote / home / file':ディレクトリではありません」にアクセスできませんでした

分類Dev

LAN経由でWindows10にアクセスしようとすると、「ユーザー名またはパスワードが正しくありません」というメッセージが表示される原因は何ですか?

分類Dev

Spring MVC:新しいエンティティレコードを作成するときに、クライアントから送信されたリクエストが構文的に正しくありませんでした

分類Dev

宛先配列は、コレクション内のすべてのアイテムをコピーするのに十分な長さではありません。配列のインデックスと長さを確認してください

分類Dev

プログラムをSSDにインストールする必要があるのはなぜですか?メモリにロードした後、ディスクアクセスを頻繁に行うべきではありませんか?

分類Dev

必要なアイコンファイルがありません。バンドルには、アプリをアップロードしようとしたときに、正確に「167x167」ピクセルのiPad用のアプリアイコンが.png形式で含まれていません。

分類Dev

1台のコンピューターから特定のWebページにアクセスすることはできませんが、さまざまなデバイスからアクセスできます。すべてが同じwifiネットワークに接続されています。どうして?

分類Dev

文字列に複数のスペースが存在する場合、単語数が正しくありません

分類Dev

画面キーボードを使用してJavaでメモ帳を作成すると、テキスト領域に正しくリンクできません

分類Dev

SQLSTATE [42000]:構文エラーまたはアクセス違反:1075テーブル定義が正しくありません。自動列は1つしか存在できず、キーとして定義する必要があります

分類Dev

構文エラーまたはアクセス違反:1075テーブル定義が正しくありません。自動列は1つしか存在できず、キーとして定義する必要があります

分類Dev

bashで文字列を分割しているときに配列の添え字が正しくありません

分類Dev

Genymotion、「VirtualBoxエンジンをロードできません。」マーベリックスに。VBoxが正しくセットアップされている

Related 関連記事

  1. 1

    Git:致命的:リモートリポジトリから読み取ることができませんでした。正しいアクセス権があり、リポジトリが存在することを確認してください

  2. 2

    docker pythonを使用した後、ubuntuを正しく再起動できません「デバイスにスペースが残っていません」、周辺機器で使用可能なメモリがありません

  3. 3

    VSTSGITに接続しているソースツリーがリモートリポジトリから読み取れませんでした。正しいアクセス権があることを確認してください

  4. 4

    Goで簡単なスクリプトを書き込もうとしていますが、インタプリタが正しくありません:アクセスが拒否されましたエラー

  5. 5

    NoSuchElementException:メッセージ:そのような要素はありません:SeleniumとPythonを使用して上位20のホルダーをスクレイピングしているときに要素エラーを見つけることができません

  6. 6

    dbExecute()を介して中国語をMySQLに挿入しようとすると、「ステートメントを実行できませんでした:文字列値が正しくありません:」エラーが発生します

  7. 7

    致命的:リモートリポジトリから読み取ることができませんでした。正しいアクセス権があることを確認してください

  8. 8

    ある数値を別の配列にコピーしようとしていますが、「インデックスが配列の範囲外でした」というメッセージが表示され続け、理由がわかりません。

  9. 9

    メモリを割り当てることができません:fork:awsで新しいプロセスをフォークできません

  10. 10

    行をコピーして結果ステップをSQLステップ条件にコピーすることにより、メモリに格納されているパラメータを渡すことができません

  11. 11

    DockerでVaultを実行しているときにVaultUIにアクセスできません:404ページが見つかりません

  12. 12

    メールアドレスをスクレイピングしている間、不要なものを取り除くことはできません

  13. 13

    リリースモードでアプリをビルドできません-キーストアが改ざんされているか、パスワードが正しくありません

  14. 14

    Windowsバッチを使用して長い文字列をクリップボードにコピーすると、「コマンドの構文が正しくありません」というエラーが発生します

  15. 15

    ASTの式のサイズがメンバーアクセスに対して正しくありません

  16. 16

    必須パラメーターがありません:ionic2でgoogleトークンにアクセスしているときにgrant_type

  17. 17

    cp file user @ remove構文を使用して、ssh経由でファイルをコピーするときに、「cp: 'user @ remote / home / file':ディレクトリではありません」にアクセスできませんでした

  18. 18

    LAN経由でWindows10にアクセスしようとすると、「ユーザー名またはパスワードが正しくありません」というメッセージが表示される原因は何ですか?

  19. 19

    Spring MVC:新しいエンティティレコードを作成するときに、クライアントから送信されたリクエストが構文的に正しくありませんでした

  20. 20

    宛先配列は、コレクション内のすべてのアイテムをコピーするのに十分な長さではありません。配列のインデックスと長さを確認してください

  21. 21

    プログラムをSSDにインストールする必要があるのはなぜですか?メモリにロードした後、ディスクアクセスを頻繁に行うべきではありませんか?

  22. 22

    必要なアイコンファイルがありません。バンドルには、アプリをアップロードしようとしたときに、正確に「167x167」ピクセルのiPad用のアプリアイコンが.png形式で含まれていません。

  23. 23

    1台のコンピューターから特定のWebページにアクセスすることはできませんが、さまざまなデバイスからアクセスできます。すべてが同じwifiネットワークに接続されています。どうして?

  24. 24

    文字列に複数のスペースが存在する場合、単語数が正しくありません

  25. 25

    画面キーボードを使用してJavaでメモ帳を作成すると、テキスト領域に正しくリンクできません

  26. 26

    SQLSTATE [42000]:構文エラーまたはアクセス違反:1075テーブル定義が正しくありません。自動列は1つしか存在できず、キーとして定義する必要があります

  27. 27

    構文エラーまたはアクセス違反:1075テーブル定義が正しくありません。自動列は1つしか存在できず、キーとして定義する必要があります

  28. 28

    bashで文字列を分割しているときに配列の添え字が正しくありません

  29. 29

    Genymotion、「VirtualBoxエンジンをロードできません。」マーベリックスに。VBoxが正しくセットアップされている

ホットタグ

アーカイブ