0

今週Cを学んだばかりです。私の仕事は、ユーザーから大きな大きな整数入力を受け取り、それを構造体整数に格納し、適切な構造体整数を標準出力に出力する関数を作成することです。プログラムはそのように動作しますが、出力を与えるとすぐに応答を停止します。コンパイラで直接エラーが発生することはなく、何が問題なのかわかりません。プログラミングスタイルを改善するためのその他のアドバイス/ヒントも本当に感謝しています:)

// Header Files Go Here
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Function Declarations Go Here
struct integer * convert_integer(char * stringInt);
void printer(struct integer * p);

struct integer {
    int * arr;
    int length;
};

// Main Program
int main() {
    char * x;
    x = (char *) malloc(sizeof(char) * 10000);
    printf("Enter a small string\n");
    scanf("%s",x);
    int j = 0;
    struct integer * book1;
    book1 = convert_integer(x);
    printer(book1);
    return 0;
}

// Function Definitions Go Here  
struct integer * convert_integer(char * stringInt) {
    struct integer * x = malloc(sizeof(int) * 100);
    int j = 0;
    while (stringInt[j] != '\0') {
        if (stringInt[j] < 48 || stringInt[j] >= 57) {
            printf("Invalid input. Enter a number ");
            return;
        }
        x->arr[j] = stringInt[j] - 48;
        j++;
    }
    x->length = j;
    printf("\n the length is %d\n", x->length);
    return x;
}

void printer(struct integer * p) {
    int j = 0;
    while (j < p->length) {
        printf("%d", p->arr[j]);
        j++;
    }
}
4

5 に答える 5

2

NPEが十分に明確ではなかったため、この回答を追加しています。


このプログラムにはいくつかのエラーがありますが、差し迫っているのは関数内にあると思いますconvert_integer。次のことを行っています。

struct integer* x= malloc(sizeof(int) * 100);

...しかし、それは正しくありません。xデータ型を考慮するために要求するメモリのバイト数が多すぎます(実際には何も問題はありません) が、arr. 次のようにする必要があります。

struct integer *x = malloc( sizeof( struct integer ) );

x->arr = malloc( sizeof( int ) * c );

...c定数はどこにありますか(あなたの場合は100ですか?)。freeこの構造体を最初freearr、次にfree構造体を使用する場合は、メモリ リークが発生することを確認してください。

あなたがしていないことに気付いた他の何か、常にシステムコールの結果を確認してくださいmalloc無効なメモリ ブロックが返されたかどうかを確認していません。

于 2013-08-10T14:22:23.987 に答える
0

ここ:

struct integer* x= malloc(sizeof(int) * 100);;

構造体 (つまり、ポインタと int) にメモリを割り当てていますが、配列にはメモリを割り当てていません。

に割り当てようとした瞬間にx->arr[j]未定義の動作が発生します。

于 2013-08-10T14:04:16.230 に答える
0

printer上にプロトタイプを追加する必要があります。番号を検証するifステートメントは、

if(stringInt[j]<48 || stringInt[j]>57)  // > instead of >=

と書いた方が分かりやすいでしょう。

if ( stringInt[j] < '0' || stringInt[j] > '9' )

isdigit関数について知っていれば、それも使用できます。

10000 文字の文字列にメモリを割り当てています。それはやり過ぎのようです。256 文字のメモリを割り当てることができ、それで十分なはずです。returnまた、ステートメントを使用して実行する前にメモリの割り当てを解除する必要がありますfree (x);

arr関数内にスペースを割り当てる必要がありconvert_integerます。割り当ては次のようにする必要があります。

struct integer* x= malloc(sizeof(integer)); x->arr = malloc ( sizeof(int) * 256 );
于 2013-08-10T14:02:11.823 に答える
0

あなたのコードは行で失敗しています

x->arr[j]=stringInt[j]-48;

その理由は、メモリ スライスを割り当てる方法です。

struct integer* x= malloc(sizeof(int) * 100);

これにより、バイトのスライスが割り当てられ、n*100そのスライスへのポインターが に格納されますx。やりたいことは次のとおりです。

struct integer *x = malloc(sizeof(*x));
x->arr = malloc(sizeof(int)*100);

integerこれにより、構造体を格納するために必要なメモリが割り当てられ、x100 個の整数を格納するためにメモリが割り当てられ、それが に割り当てられますx->arr。あなたのコードでx->arrは、初期化されていないため、ランダムな値が含まれています(より正確には、値は以前にそのメモリ位置に保存されたものです)。

割り当てられたメモリを使い終わったら、解放する必要があります。

free(x->arr);
free(x);
于 2013-08-10T14:18:52.720 に答える