在C中加倍数组大小?

时间:2013-01-12 12:41:18

标签: c arrays algorithm

所以我有一段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;

}

现在,重点在于计数器在循环结束时,将数组大小加倍。代码是否与pt1一致?另外,我在printf结束时遇到分段错误,我不知道为什么。 提前致谢!! :)

编辑: 感谢大家的答案,这是我修改过的&amp;功能代码:

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 个答案:

答案 0 :(得分:5)

您必须仅对通过致电realloc / malloc / calloc获得的指针使用realloc。你的代码没有这样做,所以它已经坏了。

应该是这样的:

char * niz = malloc(n);

// ...

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

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

// ...

free(niz);

答案 1 :(得分:3)

realloc说出第一个参数

  

指向先前使用malloc,calloc或realloc分配的内存块的指针,或指向空指针(用于分配新块)。

niz在堆栈上,因此您将有未定义的行为。您最初应使用niz分配malloc

答案 2 :(得分:2)

您无法重新分配堆栈中分配的数组。你应该开始在堆中分配它。此外,您的初始数组为char[],pt1为int*,这使得您的意图有点不清楚。

答案 3 :(得分: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);