0

私は新しいCプログラミングに非常に興味を持っています。現在、動的にメモリを割り当てるためのACプログラムを書いています。

プログラムの段階は次のとおりです。

  1. nユーザーから数字を取得します
  2. それらを印刷します
  3. nユーザーから別の番号を取得します
  4. 両方の数値セットを出力します

私のプログラムは の小さな値では問題nなく動作しますが、200000 のような大きな値ではうまくいきません。つまり、最初に 100000 個の数字を入力し、次に別の 100000 個の数字を入力しました。

最初のセットでは正常に実行されますが、その後、セグメンテーション違反が発生します。gdbデバッグに使用します。SIGSEGV エラーが表示されます。

誰かが何が起こったのか説明して、解決策を教えてもらえますか?

#include<stdio.h>
#include<malloc.h>
int main(void)
{

    unsigned int *p=NULL;
    unsigned int n;
    unsigned int i;
    unsigned int *a;
    unsigned int *t;
    unsigned int k=0;

    printf("Enter no.of elements...");
    scanf("%d", &n);

    p = (unsigned int*)malloc(n*sizeof(unsigned int));
    a = p;
    t = p;
    for (i=0; i<n; i++, *p++, k++) {
        scanf("%d",p);
    }

    for(i=0;i<n;i++,a++) {
        printf("Element No-%d %d Address->%d\n", i, *a, a);
    }

    a=t;

    printf("next time...how many elements do you enter");
    scanf("%d",&n);

    t=p;
    a = (unsigned int*)realloc((void *)a, n*sizeof(int));
    for (i=0; i<n; i++, *t++ ,k++) {
        scanf("%d",t);
    }

    printf("next time...printing..\n");

    for (i=0; i<k; i++, a++) {
        printf("Element No-%d %d Address->%d\n",i,*a,a);
    }

    free(p);
    free(a);


}
4

2 に答える 2

3

realloc割り当てのサイズを変更しますが、指定したサイズだけ割り当てを増やすことはありません。

だからあなたはする必要があります

a=realloc(a, original_size + extent_size);

またはCの戻り値をキャストする必要はありませんmallocrealloc。 )

別の注意:

t=p;
...
a=t;
...
t=p;
a=realloc(...);

treallocがブロックのアドレスを変更した可能性があるため、reallocの後に使用することはできません。t=a;reallocの後に置きます。(そして、よりわかりやすい名前を使用すると、コードを追跡するのが非常に困難になります。)

于 2012-11-11T07:43:39.990 に答える
1

非推奨ではあり#include <stdlib.h>ません#include <stdio.h><malloc.h>コードも正しくインデントしてください

2行:

for(i=0;i<n;i++,*p++,k++)
   scanf("%d",p);

疑わしいようです。なぜ*p?私はそれを作ります

for (i=0; i<n; i++, p++)
  if (scanf(" %d", p)<1) 
    exit (EXIT_FAILURE);

gccコンパイル中にすべての警告とデバッグ情報を有効にし(つまりgcc -Wall -g)、デバッガー(例gdb)とメモリリーク検出器(例)を使用してプログラムをデバッグすることを忘れないでくださいvalgrind

callocの代わりに使用することをお勧めします。また、、、、またはの結果をmallocテストする必要があります(を返すことですべてが失敗する可能性があります)。malloccallocreallocNULL

そしてマットが答えたように、あなたのrealloc電話は間違っていました。

于 2012-11-11T07:44:42.593 に答える