在C语言中如何将数组大小加倍?

3

So I have a this piece of C code:

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;
}

不要强制转换 realloc 的结果。 - Kerrek SB
char niz[n]; 这不是纯C。如果 n 很大,你会遇到麻烦。 - Eddy_Em
3
@Eddy_Em 实际上这是合法的 C 代码(但要注意保持代码简短)。 - Kos
但是这种构造将在堆栈中分配内存。realloc 分配动态内存。 - Eddy_Em
4个回答

6

你只能对通过调用malloc/calloc/realloc函数获得的指针使用realloc。你的代码没有这样做,所以它是错误的。

正确的做法应该是这样的:

char * niz = malloc(n);

// ...

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

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

// ...

free(niz);

在C++中,你可以写出if (char * tmp = std::realloc(nix, n * 2)) { niz = tmp; }来避免将tmp泄漏到当前范围。也许有一天C语言也会允许使用这种语法。 - Kerrek SB

3

realloc的第一个参数是指向先前使用malloc、calloc或realloc分配的内存块的指针,或空指针(用于分配新块)。

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

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


2

您不能重新分配在堆栈中分配的数组。您应该从堆中开始分配它。另外,您的初始数组是char[]而pt1是int*,这使得您的意图有些不清楚。


更好的说法是静态分配和动态分配。 - Shiplu Mokaddim
@shiplu.mokadd.im,不是的,栈分配通常可以被视为动态分配。 - Michael Krelin - hacker

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接