【问题标题】:Doubling the array size in C?将C中的数组大小加倍?
【发布时间】:2013-01-12 12:41:17
【问题描述】:

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

【问题讨论】:

  • 不要转换realloc的结果。
  • char niz[n]; — 这不是纯 C。如果 n 很大,你会遇到麻烦。
  • @Eddy_Em 实际上是合法的 C (但请注意保持小持有)
  • 但是这个构造会在栈中分配内存。 realloc 分配动态内存。

标签: c arrays algorithm


【解决方案1】:

您只能在通过调用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 也会允许这种语法。)
【解决方案2】:

realloc 表示它的第一个参数

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 最好说静态分配和动态分配。
    • @shiplu.mokadd.im,不,堆栈分配通常可以看作是动态的。
    【解决方案4】:
    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);
    

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 2014-04-10
      • 2021-01-08
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      相关资源
      最近更新 更多