【问题标题】:Expanding Static Arrays in C在 C 中扩展静态数组
【发布时间】:2016-02-14 10:53:11
【问题描述】:

是否可以在 C 中扩展静态数组?

我尝试创建一个函数,它分配一个新的动态数组,将内容复制到它并返回它的指针;但它不能正常工作,我每次都遇到调试错误。

我需要做这样的事情;

int a1[5] = { 1,2,5,4,1 };
extend(a1); //or  a1* = extend(a1);
.
.
.
a1[9] = 2;

到目前为止我的扩展功能;

int extend(int x[], int oldSize, int newSize) {
    int *extendedX = (int*)calloc(newSize, sizeof(int));

    int i = 0;
    for (; i < oldSize;i++) {
        extendedX[i] = x[i];
    }

    for (; i < newSize; i++) {
        extendedX[i] = 0;
    }

    return *extendedX;
}

【问题讨论】:

  • 不,不是。他们是static

标签: c arrays pointers dynamic-memory-allocation


【解决方案1】:

扩展(a1); //或者 a1* = extend(a1);

您的函数extend 需要返回int * 而不仅仅是int

int* extend(int x[], int oldSize, int newSize);

另外,您需要创建一个新的指针a2 以分配给extend 函数的返回值:

int *a2 = extend( a1, oldSize, newSize );

【讨论】:

  • 但我需要继续使用相同的变量名 a1。
  • 不,所以这是不可能的。
【解决方案2】:

你不能扩展静态数组。

你可以这样做:

#include <stdio.h>

int *extends(int ar[],int oldsz,int newsz){
    int *newAr = malloc(newsz*sizeof(int));
    for(int i = 0; i < oldsz;i++){
        newAr[i] = ar[i];
    }
    return newAr;
}
int main(void) {
    int i,a[5] = { 1, 2, 3, 4, 5};
    int *a1 = extends(a,5,10);
    a1[5] = 6;
    a1[6] = 7;
    a1[7] = 8;
    a1[8] = 9;
    a1[9] = 10;
    a1[10] = 11;
    a1[11] = 12;
    for(i = 0; i < 12; i++)printf("%d ",a1[i]);
    return 0;
}

【讨论】:

  • 这段代码怎么知道它可以分配到 a1[11]?我建议传递附加参数int newsz,并执行int *newAr = malloc(sizeof(int)*newsz);
  • 为什么要把修改移出extend()——原来的看起来好多了。他只需要将返回类型改为int *
  • 另外,初始化时最好省略数组大小:int i,a[] = { 1, 2, 3, 4, 5};
【解决方案3】:

你不能扩展静态数组,它的大小是在编译时确定的。

但是,您可以将a1 声明为指针,并使用静态初始化器来设置初始值,

int *a1 = (int[]){ 1, 2, 5, 4, 1};

然后分配extend 函数的结果(应该返回int *,就像@artm 建议的那样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多