gpt4 book ai didi

c - 就地与返回 C 中的新设计模式

转载 作者:行者123 更新时间:2023-12-04 10:34:21 24 4
gpt4 key购买 nike

来自高级语言,我试图通过学习 c 来重新定位自己。我正在尝试了解指针和内存分配(这是我以前从未想过的)。

我正在尝试的代码

#include <stdio.h>

int main()
{

int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 };

printf("\nShuffling...\n\n");
shuffle(array, sizeof(array)/sizeof(int));

int i;
for(i = 0; i < sizeof(array)/sizeof(int); i++)
{
printf("%d\n", array[i]);
}

}

int shuffle(int *shuffle_array, int length)
{
int i, j, newArray[length];
for(i = 0, j = length; i < length; j--, i++)
{
newArray[i] = shuffle_array[j];
}

shuffle_array = newArray;
}

首先,这是行不通的,我想弄清楚为什么数组在打印时没有反转。

其次,比较就地编辑的概念与使用 malloc()free() 在 c 中返回新项目的概念。

最佳答案

shuffle 中,您正在堆栈上创建一个名为 newArray 的数组(这意味着它将在函数结束时被释放)。

然后您将 shuffle_array 中的每个项目反向放入 newArray

然后您使指针 shuffle_array 成为局部变量(这意味着对其的更改不会反射(reflect)在函数外部)指向 newArray 的第一个元素。这不会改变 shuffle 之外的任何内容,因为 shuffle_array 是一个局部变量。

函数返回后,函数外的任何事情都没有发生。这是因为您只是使用 shuffle 修改本地数据。

要打乱数组(或反转它,或对它做任何事情)你必须直接修改它而不是修改一个副本。所以应该是

int tmp = shuffle_array[i];
shuffle_array[i] = shuffle_array[j];
shuffle_array[j] = tmp;

这样你就可以交换你所在的数组元素的两个值。尽管 shuffle_array 是一个临时变量,但它指向 main 中的内存块,因此即使在函数返回后修改该内存也是可见的。

你可以这样想象它:

main 中:

array  - - - - 
\
\
1, 2, 3, 4, 5, ..., 52 };

shuffle 被调用时:

array  - - - - 
\
\
1, 2, 3, 4, 5, ..., 52
/
/
/
shuffle_array

newArray - - -
\
52, ..., 5, 4, 3, 2, 1

然后当你做

shuffle_array = newArray;

看起来像

array  - - - - 
\
\
1, 2, 3, 4, 5, ..., 52



shuffle_array -
\
newArray - - - |
\ /
52, ..., 5, 4, 3, 2, 1

然后 shuffle 返回,一切恢复原状

array  - - - - 
\
\
1, 2, 3, 4, 5, ..., 52

关于c - 就地与返回 C 中的新设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8957544/

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