gpt4 book ai didi

arrays - C 数组的奇怪行为

转载 作者:行者123 更新时间:2023-12-05 03:22:18 25 4
gpt4 key购买 nike

我有两个数组 AB 都具有相同的元素 { 1, 2, 3, 4 } 但在执行 A[B[i]] = A[i] + 1 数组 B 正在填充不同的数字,但实际上它应该保持不变。

#include <stdio.h>

void arrayPrint(int *arr, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}

int main() {
int A[4] = { 1, 2, 3, 4 };
int B[4] = { 1, 2, 3, 4 };

int n = 3;

printf("Before \n");

printf("Array A \n");
arrayPrint(A, 4);

printf("Array B \n");
arrayPrint(B, 4);

for (int i = 0; i <= n; i++) {
if (A[i] == B[i]) {
A[B[i]] = A[i] + 1;
}
}

printf("\nAfter \n");

printf("Array A \n");
arrayPrint(A, 4);

printf("Array B \n");
arrayPrint(B, 4);

return 0;
}

输出是:

Before
Array A
1 2 3 4
Array B
1 2 3 4

After
Array A
1 2 3 4
Array B
5 2 3 4

但它应该是:

Before
Array A
1 2 3 4
Array B
1 2 3 4

After
Array A
1 2 3 4
Array B
1 2 3 4

最佳答案

对于 B[i] 等于 4 表达式 A[B[i]] 访问数组 A 之外的内存 因为数组 A 的有效索引范围是 [0, 3]

所以看起来编译器立即将数组 B 放置在数组 A 之后,并且数组 B 的第一个元素已更改这个声明

A[B[i]] = A[i] + 1;

i 等于 3。

代替你的 for 循环

for (int i = 0; i <= n; i++) {
if (A[i] == B[i]) {
A[B[i]] = A[i] + 1;
}
}

你可以这样写

for (int i = 0; i <= n; i++) {
if ( i != 3 && A[i] == B[i]) {
A[B[i]] = A[i] + 1;
}
}

或者更准确地说

const size_t N = sizeof( A ) / sizeof( *A );

for (int i = 0; i <= n; i++) {
if ( i != N - 1 && A[i] == B[i]) {
A[B[i]] = A[i] + 1;
}
}

关于arrays - C 数组的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72745331/

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