gpt4 book ai didi

arrays - 和 friend 一起研究C语言动态分配malloc realloc。但是有一个问题。我考虑内存设置

转载 作者:行者123 更新时间:2023-12-02 16:19:45 25 4
gpt4 key购买 nike

此代码在动态分配 5 个数组后,在达到分配给数组的大小时 (cur) 时,通过将大小增加 3 来写入额外数据。

我写的代码如下。

#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main() {

int i = 0;
int* arr = (int*)malloc(sizeof(int) * 5);
int curs = sizeof(arr) * 5 / sizeof(int);

while (1) {

printf("Input Num : (-1 input exit): ");
scanf("%d", &arr[i]);
if (arr[i] == -1)
break;

if ((i + 1) == curs) {
arr = (int*)realloc(arr, sizeof(int) * (3 + curs));
printf("Add Allocation Arr!\n");
curs += 3;
}
i++;
}
printf(" Arr : ");

for (int j = 0; j < i; j++) {
printf("%d ", arr[j]);
}
free(arr);
return 0;

}

当我输入如下数据时,它工作正常。

输入数据(输入-1 退出):1

输入数据(输入-1 退出):2

输入数据(输入-1 退出):3

输入数据(输入-1 退出):4

输入数据(输入-1 退出):5

添加分配Arr!

输入数据(输入-1 退出):1

输入数据(输入-1 退出):2

输入数据(输入-1 退出):3

添加分配Arr!

输入数据(输入-1 退出):-1

到达:1 2 3 4 5 1 2 3

这里有 friend 试过一件事。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {

int* arr = (int*)malloc(sizeof(int) * 5);
int i = 0;
int curs = sizeof(arr) * 5 / sizeof(int);

while (1) {
printf("Input Data(Input -1 Exit): ");
scanf("%d", &arr[i]);
if (arr[i] != -1) {
if ((i + 1) == curs) {
printf("Add Allocation Arr!\n");
curs += 3;
i++; // ★<-- don't use realloc, just i++
continue;
}
else {
i++;
continue;
}
}
else {
printf("Arr: ");
for (int j = 0; j < i; j++) {
printf("%d ", arr[j]);
}
break;
}
}

free(arr);
return 0;
}

如果您查看上面评论中的 ★,您会发现只需增加 i 即可访问数组,而无需 realloc。

当我输入如下数据时,它工作正常。

输入数据(输入-1 退出):1

输入数据(输入-1 退出):2

输入数据(输入-1 退出):3

输入数据(输入-1 退出):4

输入数据(输入-1 退出):5

添加分配Arr!

输入数据(输入-1 退出):1

输入数据(输入-1 退出):2

输入数据(输入-1 退出):3

添加分配Arr!

输入数据(输入-1 退出):1

输入数据(输入-1 退出):2

输入数据(输入-1 退出):3

添加分配Arr!

输入数据(输入-1 退出):-1

到达:1 2 3 4 5 1 2 3 1 2 3

为什么要运行?

出于好奇,我使用下面的代码查看内存状态。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {

int* arr = (int*)malloc(sizeof(int) * 5);
int i = 0;
int curs = sizeof(arr) * 5 / sizeof(int);
for (i = 0; i < 20; i++)
{
printf("%d ", arr[i]);
}
free(arr);
return 0;
}

执行结果如下。

-842150451 -842150451 -842150451 -842150451 -842150451 -33686019 7077988 108 -969574923 134254852 12127432 12077032 12127440 12077040 12127448 12077048 2076049408 2076489216 1527808 4456514

我只想使用分配的 5 个内存访问它。预计访问 arr[4] 索引后会发生错误,但结果打印出来了。这非常令人困惑。

最佳答案

C 语言不对数组进行任何类型的边界检查,相信程序员会做正确的事情。这是使其快速的部分原因。但这也意味着,如果您没有做正确的事情,就无法保证您的程序会按预期运行。

您看到的是 undefined behavior 的表现形式.当您读/写超过数组末尾时,程序可能会崩溃,它可能会输出奇怪的结果,或者可能(如本例)看起来正常工作。更糟糕的是,通过对代码进行看似无关的更改,例如未使用的局部变量或调用 printf 进行调试,可能会改变未定义行为的表现方式。

仅仅因为程序可能崩溃并不意味着它将会

关于arrays - 和 friend 一起研究C语言动态分配malloc realloc。但是有一个问题。我考虑内存设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65775697/

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