gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:23:10 24 4
gpt4 key购买 nike

我必须让用户知道他想要多少输入以及每个循环我需要扩展数组让其他人输入,当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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com