所以我有一段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;
}
答案 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);