ヒープ破損の問題-C

user5377005

「単純な」印刷文字列を作成し、文字列を追加し、文字列からセクションを削除しています。追加と新しい文字列が機能する場合もあれば、何も出力しない場合もあります。私がする時:

char * temp = malloc(newSize);

何も出力しなくなるだけです。

私は問題を見つけようとして、セクションですべてをコメントアウトしました。問題を見つけることができないようですが、グーグルは「ヒープ破損」を考え続けています。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char * data;
    int length;
} String;

int str_getLength(const char * characters)
{
    int index = 0;
    while (1)
    {
        if (characters[index] == '\0') break;
        index++;
    }
    return index;
}

String str_new(const char * characters) 
{
    String result;
    result.length = str_getLength(characters);
    result.data = malloc(result.length);
    memcpy(result.data, characters, result.length);
    return result;
}

void str_append(String * str, const char * characters) 
{
    int charsLength = str_getLength(characters);
    str->data = realloc(str->data, charsLength);
    for (int i = 0; i < charsLength; i++) {
        str->data[i + str->length] = characters[i];
    }
    str->length = str->length + charsLength;
}

void str_remove(String * str, int startIndex, int endIndex) 
{
    if (startIndex < 0 || endIndex > str->length || endIndex < startIndex) {
        return;
    }
    int chunkSize = endIndex - startIndex;
    int newSize = str->length - chunkSize;

    char * temp = malloc(newSize);
    // for (int i = 0; i < str->length; i++) 
    // {
    //  if (i < startIndex || i > endIndex) {
    //      temp[i] = str->data[i];
    //  } 
    // }

    // free(str->data);
    // str->length = newSize;
    // str->data = temp;
}
}

int main() 
{
    String str = str_new("Hello, ");
    printf("%s\n", str.data);

    str_append(&str, "this is my first C application.");
    printf("%s\n", str.data);

    str_remove(&str, 0, 3);
    printf("%s\n", str.data);

    free(str.data);

    return 0;
}

変更された文字列を出力することを期待していましたが、出力せず、場合によっては何も出力しません。私は初心者です、それが簡単な修正であるならば申し訳ありません。

キランビラダー

炎の答えは別として。もう少し問題があります。

// for (int i = 0; i < str->length; i++) 
// {
//  if (i < startIndex || i > endIndex) {
//      temp[i] = str->data[i];
//  } 
// }

の範囲外にアクセスしますtempの個別のインデックスを維持する必要がありtempます。

char * temp = malloc(newSize+1);
int k=0;
for (int i = 0; i < str->length; i++) 
 {
  if (i < startIndex || i > endIndex) {
      temp[k++] = str->data[i];
  } 
}
 temp[k] = '\0'; 
 free(str->data);
 str->length = newSize;
 str->data = temp;

そして

null追加後に文字列を終了していません

str->data = realloc(str->data, str->length + charsLength +1); //current length + new length + \0
for (int i = 0; i < charsLength; i++) {
    str->data[i + str->length] = characters[i];
}
 str->data[i + str->length] = '\0'; //null terminate the new string
str->length = str->length + charsLength;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ヒープの破損、C のエラー

分類Dev

単純なC ++プログラムでのヒープ破損

分類Dev

ヒープの破損が検出されました| C

分類Dev

Cプログラムでヒープの破損を見つける

分類Dev

ヒープが破損しています。C#dllimport、delphiPCharの戻り値

分類Dev

Cのヒープが破損していて、理由がわかりません

分類Dev

CPythonメモリヒープ破損の問題

分類Dev

エラーc ++アサーションの失敗ヒープの破損が検出されました

分類Dev

c ++プログラムの実行時にヒープが破損しましたエラー

分類Dev

C ++ヒープ破損、ただしユニットテストプロジェクトのみ

分類Dev

ヒープの破損により、C ++でエラーが検出されました

分類Dev

c ++の「ヒープが破損しています」エラーを修正する方法は?

分類Dev

C ++:通常のブロック後にヒープの破損が検出されました

分類Dev

C ++:通常のブロック後にヒープの破損が検出されました

分類Dev

C ++ dllヒープメモリ割り当ての問題

分類Dev

c ++ delete [] 2D配列によりヒープが破損しました

分類Dev

C#アプリでマーシャリングされた構造体を受け取った直後のヒープの破損

分類Dev

C ++のdeleteステートメントは、.net4.5プロセスでヒープ破損例外をスローします

分類Dev

ヒープの破損-デバッグアサーションが失敗しました。dbgheap.cの1322行の式_crtIsValidHeapPointer(pUserData)

分類Dev

C ++ウィンドウがブレークポイントをトリガーしました-ヒープの破損

分類Dev

クラス内のいくつかの配列でdelete []を呼び出しているときに「ヒープ破損が検出されました」-C ++

分類Dev

文字列を削除した後、C ++でヒープ破損が検出されました

分類Dev

C-アレイを解放するときにヒープ破損が検出されました

分類Dev

C ++ Struct ArrayWinフォームの破損

分類Dev

JNIヒープ破損問題をデバッグする方法は?

分類Dev

realloc()またはfree()またはdoublefreeまたは破損のCに関する問題

分類Dev

Cでのこのヒープソートの実装の何が問題になっていますか?

分類Dev

C ++の多重継承とアップキャストされたスマートポインターの破壊により、VS2017でヒープが破損します

分類Dev

Rails rdocGemエラー/破損の問題

Related 関連記事

  1. 1

    ヒープの破損、C のエラー

  2. 2

    単純なC ++プログラムでのヒープ破損

  3. 3

    ヒープの破損が検出されました| C

  4. 4

    Cプログラムでヒープの破損を見つける

  5. 5

    ヒープが破損しています。C#dllimport、delphiPCharの戻り値

  6. 6

    Cのヒープが破損していて、理由がわかりません

  7. 7

    CPythonメモリヒープ破損の問題

  8. 8

    エラーc ++アサーションの失敗ヒープの破損が検出されました

  9. 9

    c ++プログラムの実行時にヒープが破損しましたエラー

  10. 10

    C ++ヒープ破損、ただしユニットテストプロジェクトのみ

  11. 11

    ヒープの破損により、C ++でエラーが検出されました

  12. 12

    c ++の「ヒープが破損しています」エラーを修正する方法は?

  13. 13

    C ++:通常のブロック後にヒープの破損が検出されました

  14. 14

    C ++:通常のブロック後にヒープの破損が検出されました

  15. 15

    C ++ dllヒープメモリ割り当ての問題

  16. 16

    c ++ delete [] 2D配列によりヒープが破損しました

  17. 17

    C#アプリでマーシャリングされた構造体を受け取った直後のヒープの破損

  18. 18

    C ++のdeleteステートメントは、.net4.5プロセスでヒープ破損例外をスローします

  19. 19

    ヒープの破損-デバッグアサーションが失敗しました。dbgheap.cの1322行の式_crtIsValidHeapPointer(pUserData)

  20. 20

    C ++ウィンドウがブレークポイントをトリガーしました-ヒープの破損

  21. 21

    クラス内のいくつかの配列でdelete []を呼び出しているときに「ヒープ破損が検出されました」-C ++

  22. 22

    文字列を削除した後、C ++でヒープ破損が検出されました

  23. 23

    C-アレイを解放するときにヒープ破損が検出されました

  24. 24

    C ++ Struct ArrayWinフォームの破損

  25. 25

    JNIヒープ破損問題をデバッグする方法は?

  26. 26

    realloc()またはfree()またはdoublefreeまたは破損のCに関する問題

  27. 27

    Cでのこのヒープソートの実装の何が問題になっていますか?

  28. 28

    C ++の多重継承とアップキャストされたスマートポインターの破壊により、VS2017でヒープが破損します

  29. 29

    Rails rdocGemエラー/破損の問題

ホットタグ

アーカイブ