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;

}

现在这里的重点是当计数器在循环中到达末尾时,将数组大小加倍。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 分配的内存块的指针,或空指针(用于分配新块)。

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

于 2013-01-12T12:45:17.950 回答
2

您不能重新分配在堆栈中分配的数组。您应该从在堆中分配它开始。此外,您的初始数组 ischar[]和 pt1 is 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 回答