0

char*2 進数を表すを取り、その数値に 1 を加算する関数を作成しました。非常に紛らわしいエラーが発生しました。これは、関数char*を呼び出すときにユーザー入力から来たときに関数が正常に機能し、ダンディであるということです(別名argv[1])が、Bus error: 10代わりに変数を内部で初期化して同じ関数に渡すと. この背後にあるものがわからないので、皆さんに頼ります。これが私のコードです:

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

void addOneBinaryMain(char* strBiNum, int index)
{
    if (strBiNum[index] == '0' || index == 0) { //BUS ERROR OCCURS HERE
        strBiNum[index] = '1';
        return;
    } else {
        strBiNum[index] = '0';
        addOneBinaryMain(strBiNum, index - 1);
    }
}

void addOneBinary(char* strBiNum)
{
    addOneBinaryMain(strBiNum, strlen(strBiNum)-1);
}

int main(int argc, char* argv[]) {
    char* str = argv[1];
    char* strZero = "00000000";
    int i;

    printf("%s\n", str);
    printf("%s\n", strZero);

    addOneBinary(str);
    printf("added one to input string: %s\n", str); //succeeds
    addOneBinary(strZero);
    printf("added one to internal zero string: %s\n", strZero);

    return 0;
}

printステートメントでエラーをたどると、addOneBinaryMainマークした時点で関数(再帰ステップ)で発生しているようです。

4

2 に答える 2

1

strZero変更できない定数文字列を指している

于 2012-10-12T00:27:54.090 に答える
1

strZero は、リテラル文字列「000000」のアドレスで初期化された単なるポイントです。このリテラル文字列は、アプリケーションの RAM 内の読み取り専用の場所に格納されます (記憶が正しければstatic storeと呼ばれていると思います)。

スタックまたはヒープで char 配列を宣言し、strcpy を使用して strZero をそれにコピーしてみてください。

于 2012-10-12T00:30:45.423 に答える