3

だから私はこのCコードを持っています:

void main (void){

int i,n,r,*pt1;
printf("Enter array size:\n");
scanf("%d",&n);
srand(time(NULL));
char niz[n];
pt1=niz;
for (i=0;i<n;i++){
    r=rand() % (15);
    printf("%d\n",r);
    if (r==0)
        break;
   niz[i]=r;
    if (i==n){
        pt1=(char*)realloc(niz,(sizeof(n)*2));
        if (pt1==NULL)
        printf("Jbg");
    }

}

free(pt1);
return 0;

}

ここでのポイントは、カウンターがループの最後に来て、配列サイズを 2 倍にすることです。pt1のコードは大丈夫ですか?また、printf の最後でセグメンテーション違反が発生しますが、その理由がわかりません。前もって感謝します!!:)

編集:皆さんの回答に感謝します。これは私の改訂された機能的なコードです:

void dupla(int n){ 

int i,r;
srand(time(NULL));
char * niz=malloc(n);
for (i=0;i<n;i++){
    r=rand() % (15);
    printf("%d\n",r);
        if (r==0)
            break;
niz[i]=r;
        if (i==n){
            niz=(char*)realloc(niz,n*2);
        }
}
if (niz==NULL)
            printf("Jbg");
        else
            printf("It works\n");
            printf("%d",sizeof(niz));
free(niz);
}


void main (void){

int n;
printf("Enter array size:\n");
scanf("%d",&n);
dupla(n);
return 0;
}
4

4 に答える 4

6

//reallocへの呼び出しによって取得されたポインターでのみ使用する必要があります。あなたのコードはそれをしないので、壊れています。malloccallocrealloc

おそらく次のようになります。

char * niz = malloc(n);

// ...

char * tmp = realloc(niz, n * 2);

if (tmp) { niz = tmp; }
else     { /* flagrant error */ }

// ...

free(niz);
于 2013-01-12T12:44:42.497 に答える
3

realloc最初のパラメーターについて言う

malloc、calloc、または realloc で以前に割り当てられたメモリ ブロックへのポインタ、または null ポインタ (新しいブロックを割り当てるため)。

nizスタック上にあるため、未定義の動作が発生します。最初にniz使用して割り当てる必要があります。malloc

于 2013-01-12T12:45:17.950 に答える
2

スタックに割り当てられた配列を再割り当てすることはできません。ヒープに割り当てることから始めるべきでした。また、あなたの初期配列はchar[]であり、 pt1 はint*であるため、意図が少し不明確になります。

于 2013-01-12T12:43:47.840 に答える
1
char* pt1 = malloc(n);
for (i=0; i < n + 1; i++) { // 1 more than the elements for the if.
    r = rand() % (15);
    printf("%d\n",r);
    if (r == 0)
        break;
    pt1[i] = r;
    if (i == n) { // Past end of array.
        n *= 2;
        --i; // So in the next loop i == old n.
        pt1 = (char*)realloc(pt1, n)); // n * sizeof(char)
        if (pt1 == NULL) {
            printf("Jbg");
            break;
        }
    }
}
free(pt1);
于 2013-01-12T12:53:23.177 に答える