每个循环C展开1个元素的数组

use*_*408 2 c arrays pointers loops 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;
}
Run Code Online (Sandbox Code Playgroud)

它使用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;
}
Run Code Online (Sandbox Code Playgroud)

Iha*_*imi 6

最不重要的错误是你没有将新的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;
}
Run Code Online (Sandbox Code Playgroud)

然后在 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);
}
Run Code Online (Sandbox Code Playgroud)

还要注意,

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

  2. 总是检查返回值,scanf()否则最终会调用未定义的行为,程序将以未定义的方式运行.

  • 我建议不要为每个元素重新分配 (2认同)