似乎我仍然没有正确使用C指针。

我希望全局数组(指针)j的长度是动态的。

我有这个(Arduino)代码

unsigned int* j;

void setup() {

  Serial.begin(9600);

  initj();

  Serial.println(j[0]); //111 -> right
  Serial.println(j[0]); //768 -> wrong!
  Serial.println(j[1]); //32771 -> wrong!
}

void initj() {
  unsigned int i[2];
  i[0] = 111;
  i[1] = 222;

  j = i;

  Serial.println(j[0]); // 111 -> right
  Serial.println(j[1]); // 222 -> right
}

void loop() {
}

我该怎么做呢?

先感谢您!

===============>>#1 票数:3 已采纳

您的initj()函数将j设置为指向本地数组。 此数组的生存期仅限于函数调用本身,函数返回后,指针将不再有效。 因此,尝试取消引用j未定义的行为

我不确定您要做什么,但有三种可能:

  1. 改为在全球范围内声明i
  2. 声明istatic
  3. 使用malloc动态分配数组(可能不适用于嵌入式平台)。

===============>>#2 票数:2

这是因为数组i[2]对于initj()函数而言是局部的。 因此,一旦函数返回,它将不再有效。 因此,指针j变为悬空指针。

因此,您已经调用了未定义的行为。

至于这两行为何如此行事:

Serial.println(j[0]); //111 -> right
Serial.println(j[0]); //768 -> wrong!

即使这些值丢失了,它们仍然恰好在堆栈上。 因此,在调用Serial.println之前访问它时,将获得“正确的”值。 但是该函数调用最终将覆盖堆栈。 因此,在第二次调用时,它给出了错误的值。

但是无论如何,它仍然是未定义的行为。 任何事情都可以发生。


要解决此问题,您需要将值放在setup()函数可见的范围内。 您可以全局声明i[2] ,也可以在setup()并将其传递给initj()函数。

您还可以使用malloc()在堆内存中动态分配数组。 (并确保稍后使用free()将其free()

===============>>#3 票数:1

一旦完成了initj,它的堆栈空间就会被操作系统破坏(或者实际上是移动了堆栈指针,并且initj的地址不再可靠了)。 因为i存在于那个堆栈空间中,所以i走了。 ou只是将i的值复制到j 因此,在setup()中, j是一个悬空指针。

  ask by speendo translate from so

未解决问题?本站智能推荐:

1回复

我如何使我的数组在C函数中全局化?

嘿,我确实有问题。 我在C中获得了这两个函数。这个想法是在第一个函数中,我将创建并填充数组。 第二个函数将两个数组的值相加。 但是当我尝试时,程序会崩溃。 我想我知道问题出在哪里。 它的原因是我的数组是本地数组,稍后我无法将它们从main发送到第二个函数。 那么我该如何解决这个问题
3回复

将变量(结构数组)从全局更改为局部(简单的C程序)

这是我在C语言中编译的代码。目前,我有一个全局变量'code',它是structs(struct指令)的数组。 我一直在尝试使其成为main中的局部变量,并将其作为参数传递。 我也相信这意味着我将需要读取文件返回一个struct指令*。 如果有人可以解释或向我展示如何正确使用“代码”作为局
2回复

数组声明:全局与本地

为什么在全局可能的情况下,为什么不能在主函数内部或本地任何函数内部声明10000000个整数(或者说足够大)的数组?
1回复

将全局数组转换为本地数组并在函数之间传递

我是Vanilla JS的新手,目前正在从事一项任务,该任务使我们能够自由创建自己想要的任何类型的网站,其基础是将所有代码分解为功能并且不使用全局变量。 我几乎完成了一个非常基本的地址簿,该地址簿使用名称和电话号码作为输入,将值存储到数组中,并在按下“查看所有联系人”按钮时返回联系人列表。 我唯一的
1回复

局部数组变量排除不良访问细分和局部或全局?

您好,我已经看到了本地数组变量的最大大小,但是我想知道为什么如果将数组设置为离子全局而不是正常的(如果它位于主数组之后)是不可行的。 还有一个相关的问题:在a.cpp中定义并使用extern在a.hpp中声明的大内存对象是一种好习惯吗? 或者更好地使用在本地函数中定义但定义为vector
2回复

Google Apps脚本全局数组功能不可编辑

我在Google Apps脚本中写了一个小脚本,它创建了一个数组,当您按下按钮时,应该在数组中添加“测试”,然后打印整个数组。 因此,当您第一次按下按钮时,它应该显示1个“测试”。 当您第二次按下它时,它应该显示第一个测试以及包含2个“ test”的新数组,因此总共显示3个“ test”。
1回复

MPI-如何将计数从本地数组转换为全局数组?

我正在尝试实现用于计数排序的MPI程序。 我已经为每个等级发送了一个本地计数数组以供使用。 当我将它们发送回主进程时,如何确保将所有本地数组都添加到全局数组中? 我已经看到MPI_Reduce获得数组的总和,但是我需要每个单元格的总和。 例:
2回复

全局和局部变量

为什么该程序将输出表示为b ...当我将a,b和c设置为全局变量时可以工作...如果我希望将它们用作局部变量应该怎么做...使用函数
6回复

将变量从全局更改为局部-C

我已经为一个项目编写了以下代码,但是它未通过单个测试,要求两个变量不是全局变量,而是对main()局部变量。 修改structexample1.c ,以使变量student和anotherStudent不在全局范围内,而在main范围内。 我模糊地理解了本地和全球概念,但是不确定如何在我编写
4回复

为什么全局变量总是初始化为'0',而不是局部变量? [重复]

可能重复: 为什么全局变量和静态变量初始化为默认值? 看代码, 产量 这里'a'用'0'初始化,但'i'用'垃圾值'初始化。 为什么?