0
struct integer
{
    int len;
    char* str;
    int* arr;
}int1, int2;


int main(void) {
    printf("Please enter 1st number\n");
    int1.str= str_input();
    int1.len=chars_read-1;
    int1.arr= func2(int1.len, int1.str);
    printf(("\%c\n"), *int1.str);
    printf("Please enter 2nd number\n");
    int2.str = str_input();
    int2.len=chars_read-1;
    printf(("\n %c\n"), *int1.str );
    int2.arr= func2(int2.len, int2.str);

入力が 4363 と 78596 の場合、出力はそれぞれ 4 と 7 です。

出力は 4 と 4 ではありません。両方が異なるオブジェクトであることを考えると、両方に異なるメモリ割り当てが必要ではないでしょうか?

注意: これはタイプミスではありません。両方とも同じ *int1.str を使用しました。問題は、私は変更を加えていませんが、その値が変化していることです。どのように?str_input() が違いを生むとは思いません。

char* str_input(void) {
char cur_char;
char* input_ptr = (char*)malloc(LINE_LEN * sizeof(char));
char input_string[LINE_LEN];
//while ((cur_char = getchar()) != '\n' && cur_char<='9' && cur_char>='0' && chars_read < 10000)
for(chars_read=1; chars_read<10000; chars_read++)
{
    scanf("%c", &cur_char);
    if(cur_char!='\n' && cur_char<='9' && cur_char>='0')
    {
        input_string[chars_read-1]= cur_char;
        printf("%c\n", input_string[chars_read-1]);
    }
    else{
            break;
    }
}
input_string[chars_read] = '\n';
input_ptr = &input_string[0]; /* sets pointer to address of 0th index */
return input_ptr;
}

//chars_read is a global variable.

前もって感謝します。

4

2 に答える 2

2

他の場所で述べたように、質問の呼び出しは両方とも にprintf渡さ*int1.strprintfます。

ただし、それが質問の単なるタイプミスであり、2 番目のprintf呼び出しがパスする*int2.str場合、問題はstr_input固定バッファーのアドレスを返すことです (静的またはさらに悪いことに、自動ストレージ期間)。代わりに、orをstr_input使用して各文字列に新しいメモリを割り当て、そのポインタを返す必要があります。次に、呼び出し元はメモリを解放する必要があります。mallocstrdup

または、str_input呼び出し元から渡されたバッファーとサイズを受け入れるように変更することもできます。呼び出し元は、呼び出しごとに異なるバッファーを提供する責任があります。

新規掲載コードについて

のコードには次のstr_input行が含まれています。

char* input_ptr = (char*)malloc(LINE_LEN * sizeof(char));

input_ptrこれは a であると宣言し、スペースを取得するためchar *に呼び出します。malloc次にinput_ptr、その空間のアドレスを含むように設定されます。後で、str_input次の行が含まれます。

input_ptr = &input_string[0];

その行は の以前の値を完全に無視しinput_ptr、 のアドレスで上書きしますinput_string[0]。したがって、によって返されたアドレスmallocはなくなりました。このstr_input関数は、input_string[0]呼び出されるたびにアドレスを返します。これは間違っています。割り当てられたスペースのアドレスを毎回返すstr_input 必要があります。

通常、このようなルーチンは全体を通して使用され、そのアドレスの配列でinput_ptr作業を行います。その作業にchar別の配列 を使用しません。input_stringしたがって、 の定義を削除し、 が指す空間ですべての作業を行うようにinput_string変更します。str_inputinput_ptr

また、バッファのサイズをLINE_LEN1 か所に設定せず、文字数を で制限しchars_read < 10000ます。すべての場所で同じ制限を使用します。また、最後のヌル文字に 1 バイトを許可します (ただし、最後にヌル バイトを必要とする操作を絶対に実行しないように十分に注意している場合を除きます)

于 2013-08-10T19:04:28.540 に答える