在 C 中重新分配 random int
Realloc in C random int
我在重新分配动态分配数组的内存时遇到问题。所以我想做的是:
typedef struct {
int s;
int l;
int* arr;
bool orient;
}DAC;
...
int main()
{
DAC heap = {
4, 0, (int*)malloc(4 * sizeof(int))
};
char c = 0;
int n = 0;
while (1)
{
scanf("%c", &c);
switch (c)
{
case '+':
if (heap.s == heap.l)
{
heap.s *= 2;
heap.arr = (int*)realloc(heap.arr, heap.s);
}
scanf("%d\n", &(heap.arr[heap.l]));
heap.l++;
break;
case 'p':
for (int i = 0; i < heap.l; i++)
printf("%d ", heap.arr[i]);
printf("\n");
break;
}
}
}
只要我的整个结构适用于 n<5(我从大小为“4”的数组开始),执行此块时就会发生奇怪的事情:
if (heap.s==heap.l)
{
heap.s*=2;
heap.arr=(int*)realloc(heap.arr,heap.s);
}
我在数组的索引 [2] 处得到错误输出的原因是什么?
我知道我可以用 mallocs 做到这一点,只是想知道,因为我认为这是奇怪的情况
整个input/output:
+ 1
+ 2
+ 3
+ 4
p
1 2 3 4
+ 5
p
1 2 -33686019 4 5
初始化时你开始正确heap
:
DAC heap = {
4, 0, (int*)malloc(4 * sizeof(int))
};
但是当你真正想增加大小时,你忘记调整到整数大小时。
不是增加大小以适应 8 个 int
值,而是只得到 8 个字节。
正如 Felix G 在评论中提醒的那样,你永远不应该直接分配给同一个指针。如果 realloc
returns NULL
您将无法再访问旧地址。
改用这个:
if (heap.s == heap.l)
{
heap.s *= 2;
void *tmp = realloc(heap.arr, heap.s * sizeof(int));
if (tmp != NULL) {
heap.arr = tmp;
} else {
// handle error...
}
}
我在重新分配动态分配数组的内存时遇到问题。所以我想做的是:
typedef struct {
int s;
int l;
int* arr;
bool orient;
}DAC;
...
int main()
{
DAC heap = {
4, 0, (int*)malloc(4 * sizeof(int))
};
char c = 0;
int n = 0;
while (1)
{
scanf("%c", &c);
switch (c)
{
case '+':
if (heap.s == heap.l)
{
heap.s *= 2;
heap.arr = (int*)realloc(heap.arr, heap.s);
}
scanf("%d\n", &(heap.arr[heap.l]));
heap.l++;
break;
case 'p':
for (int i = 0; i < heap.l; i++)
printf("%d ", heap.arr[i]);
printf("\n");
break;
}
}
}
只要我的整个结构适用于 n<5(我从大小为“4”的数组开始),执行此块时就会发生奇怪的事情:
if (heap.s==heap.l)
{
heap.s*=2;
heap.arr=(int*)realloc(heap.arr,heap.s);
}
我在数组的索引 [2] 处得到错误输出的原因是什么? 我知道我可以用 mallocs 做到这一点,只是想知道,因为我认为这是奇怪的情况
整个input/output:
+ 1
+ 2
+ 3
+ 4
p
1 2 3 4
+ 5
p
1 2 -33686019 4 5
初始化时你开始正确heap
:
DAC heap = {
4, 0, (int*)malloc(4 * sizeof(int))
};
但是当你真正想增加大小时,你忘记调整到整数大小时。
不是增加大小以适应 8 个 int
值,而是只得到 8 个字节。
正如 Felix G 在评论中提醒的那样,你永远不应该直接分配给同一个指针。如果 realloc
returns NULL
您将无法再访问旧地址。
改用这个:
if (heap.s == heap.l)
{
heap.s *= 2;
void *tmp = realloc(heap.arr, heap.s * sizeof(int));
if (tmp != NULL) {
heap.arr = tmp;
} else {
// handle error...
}
}