c - 每个循环扩展 1 个元素的数组 C

标签 c arrays loops pointers realloc

我必须让用户知道他想要多少输入以及每个循环我需要扩展数组让其他人输入,当n=-1 我需要结束循环。

这是我的代码:

void extend(int *a)
{
    int *pt;
    pt = (int*) realloc(a , sizeof(int));   
}

int main()
{
    int *a;
    a = (int*)malloc(sizeof(int));
    int i=0;
    int n=0;

    while(n!=-1) {
        scanf("%d", &n);
        if(n != -1) {
            a[i] = n;
            extend(a);
            i++;        
        }
    }       
    return 0;
}

它适用于 3 个值,然后它停止工作,我可以按我想要的方式循环,但是当 n 变为 -1 时它崩溃了。我在某些编译器中出现“下一个尺寸无效”错误。

编辑:

此代码有效:

int main()
{
    int *a = (int*)malloc(0);
    int i=0;
    int n;

    do {
        scanf("%d", &n);
        if(n!=-1) {
            i++;
            a = (int*) realloc(a , i*sizeof(int));
            a[i-1] = n;   
        }
    } while(n!=-1);

    return 0;
}

最佳答案

最重要的错误是您没有将新的 realloc()ed 指针重新分配给以前的指针,而且您并没有真正改变大小。

试试这个

size_t extend(int **original, size_t oldsize)
{
    void *pointer;
    pointer = realloc(*original, (oldsize + 1) * sizeof(*original);
    if (poitner == NULL)
        return oldsize;
    *original = pointer;
    return oldsize + 1;
}

然后在 main()

size_t size;
int *data;
int number;

data = malloc(sizeof(int));
if (data == NULL)
    return -1;
size = 1;
while ((scanf("%d", &number) == 1) && (number != -1))
{
    data[size] = number;
    size = extend(data, size);
}

另请注意,

  1. 就 CPU 使用率而言,分配内存非常昂贵,因此您可能希望避免为每个元素都分配内存。也许定义一个 struct 来保存大小和容量(可能有多少整数的估计值),当超过容量时,realloc() 考虑分配足够的空间以防止 realloc() 再次过快。

  2. 始终检查 scanf() 的返回值,否则您将最终调用未定义的行为并且您的程序将以未定义的方式运行。

关于c - 每个循环扩展 1 个元素的数组 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34819583/

相关文章:

带有 fork 的子进程

sql - 获取主键顺序中的下一个id

ruby - 使用 Mechanize 点击谷歌页面

javascript - 循环到单个语句

c# - 如何检查目录是否共享?

c - WebGL 着色器中十六进制到 RGB 值

javascript - 是否有任何高阶函数可以从 javascript 中的对象数组返回对象?

SQL 查询 – 执行循环但使用变量数组

c - 二维数组和枚举

java - 可整除和对