【问题标题】:in C Why can't change this array? like arr1=arr2;在 C 为什么不能改变这个数组?像 arr1=arr2;
【发布时间】:2021-04-09 00:40:26
【问题描述】:

为什么不能在函数中使用 arr1=arr2?

#include <stdio.h>

int func(int* arr1, int* arr2)
{
    for (int i = 0;i < 3;i++)
    {
        arr2[i] = i;
    }
    **"arr1 = arr2";**
}

int main()
{
    int arr1[3];
    int arr2[3];
    func(arr1, arr2);
    for (int i = 0;i < 3;i++)
        printf("%d\n", *(arr1+i));
return 0;
}

我收到了其他人的问题。 为什么这个程序打印垃圾值。 我认为。它必须链接到单个元素 喜欢

for(int i =0; i&lt;3; i++) { arr1[i]=arr2[i] }

但我不知道为什么,所以告诉我一些事情..

【问题讨论】:

  • 函数中的 arr1 = arr2 只会将一个指针的地址分配给另一个;由于这些指针参数只是副本,因此实际上什么都不会做。但是无论如何,您的代码都有未定义的行为,因为这两个数组都没有在 main 中初始化。
  • 在你上面的程序中,你从来没有初始化arr1。因此,当您打印arr1 的内容时,您将打印出垃圾值。此外,您永远不会将 arr1 复制到 arr2 中。您正在使用 0 到 2 的值初始化 arr2。
  • @Adrian Mole 谢谢!我明白了!
  • 一种语言的语法并不能告诉你任何关于底层实际发生的事情。 a = b 在不同的语言中意味着完全不同的东西。除非书中告诉你 a = b 会将 b 复制到 a 中,否则不要假设它。
  • @AdrianMole:使用未初始化的数组元素没有未定义的行为。

标签: c


【解决方案1】:

int func(int *arr1, int *arr2) 等函数定义中,函数的参数 只接收来自调用者的。当使用func(arr1, arr2) 调用此函数时,mainarr1 将作为参数传递给该函数。在函数内部,参数arr1 是该参数值的副本

然后,在函数内部,arr1 = arr2; 语句只改变了这个参数的值。对mainarr1的值没有影响。

考虑main中的这段代码:

int arr1[3];
int arr2[3];
int *p = arr1; // Set `p` to point to first element of `arr1`.
func(&p, arr2);

然后我们更改func 以接受指针的地址,而不仅仅是一个指针:

int func(int **arr1, int *arr2)
{
    for(int i = 0; i < 3; ++i)
        arr2[i] = i;
    *arr1 = arr2;
}

然后,当func改变*arr1时,它的参数arr1指向的对象也随之改变。该对象是main 中的指针p。然后,在main 中,您可以使用以下命令进行打印:

for (int i = 0; i < 3; ++i)
    printf("%d\n", p[i]);

【讨论】:

  • 很好的答案,谢谢。注意:函数应该是无效的。
  • @EricPostpischil 如果 'arr' 在堆栈上,你能像你一样做 &(&arr) 并传递它吗?
  • @tf3: 不,因为&amp;arr 是一个值,而不是一个对象,所以你不能用&amp; 获取它的地址。一旦定义了一个数组,它就有一个固定的位置,不能移动。 (它的数据可以复制到一个新的位置,但那是另一回事。)
  • @EricPostpischil 好的,这意味着 arr1 什么都没有发生,只是 p 指向 arr2 的第一个元素,对吧?
【解决方案2】:

为什么arr1=arr2不能在函数中使用?

因为 C 语言规范(阅读 n1570 或更新版本)是这么说的。在第 6.5.16.1 节中。另见this C reference

总而言之,您可以分配标量类型(布尔值、字符、枚举、数字或指针)或structunions,但不能分配数组。

您似乎正在分配一个按值传递的指针作为参数。这对调用者和用作参数的指针没有影响(实际上main 中的数组在传递给函数时会衰减为指针)。

您可以使用标准的memcpy 函数来分配不重叠的数组。

【讨论】:

  • 在 OP 询问的 arr1 = arr2; 语句中,arr1 不是一个数组。它是一个指针,可以赋值。
【解决方案3】:

你可以这样做
for (int i = 0; i &lt; 1; i++) {
arr1[i] = arr2[i];
break;
}

【讨论】:

  • 那里休息是为了什么?
猜你喜欢
  • 1970-01-01
  • 2022-12-04
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多