Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向数组的全局指针_C_Arrays_Global_Local_Arduino - Fatal编程技术网

C 指向数组的全局指针

C 指向数组的全局指针,c,arrays,global,local,arduino,C,Arrays,Global,Local,Arduino,似乎我仍然没有正确地理解C语言中的指针 我希望全局数组(指针)j的长度是动态的 我有这个(Arduino)代码 我怎样才能做到这一点 提前谢谢你 这是因为数组i[2]是initj()函数的本地数组。因此,一旦函数返回,它就不再有效。因此,指针j成为一个悬空指针 所以您调用了未定义的行为 至于为什么这两条线的行为如此: Serial.println(j[0]); //111 -> right Serial.println(j[0]); //768 -> wrong! 即使这些值丢失了

似乎我仍然没有正确地理解C语言中的指针

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

我有这个(Arduino)代码

我怎样才能做到这一点


提前谢谢你

这是因为数组
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()
释放它)

这是因为数组
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()
释放它)

您的
initj()
函数将
j
设置为指向本地数组。此数组的生存期仅限于函数调用本身,一旦函数返回,指针就不再有效。因此,尝试取消引用
j
是错误的

我不知道你到底想做什么,但有三种可能性:

  • 改为在全局范围内声明
    i
  • i
    声明为
    static
  • 使用
    malloc
    动态分配阵列(可能不适合嵌入式平台)
  • 您的
    initj()
    函数将
    j
    设置为指向本地数组。此数组的生存期仅限于函数调用本身,一旦函数返回,指针就不再有效。因此,尝试取消引用
    j
    是错误的

    我不知道你到底想做什么,但有三种可能性:

  • 改为在全局范围内声明
    i
  • i
    声明为
    static
  • 使用
    malloc
    动态分配阵列(可能不适合嵌入式平台)

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

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

    “我希望全局数组(指针)j的长度是动态的。”(强调添加)数组和指针不是同义词,如果您认为它们是同义词,那么您可能一开始就遇到麻烦。是的,它们有很多相同的语法,是的,数组很快就会衰减为指针,但它们是不同的东西。您需要了解堆和堆栈之间的区别。尤其是退出函数时堆栈存储会发生什么情况。我建议首先学习在桌面上编写一点C代码,一旦你学得足够多,就去你的Arduino(它实现了C或C++的一个小变体)@basileStrynkevitch在Arduino上编写代码并不难(尽管我不得不承认我在指针方面有问题)。无论如何,谢谢你。“我希望全局数组(指针)j的长度是动态的。”(重点补充)数组和指针不是同义词,如果你认为它们是同义词,那么你可能从一开始就遇到麻烦。是的,它们有很多相同的语法,是的,数组很快就会衰减为指针,但它们是不同的东西。您需要了解堆和堆栈之间的区别。尤其是退出函数时堆栈存储会发生什么情况。我建议首先学习在桌面上编写一点C代码,一旦你学得足够多,就去你的Arduino(它实现了C或C++的一个小变体)@basileStrynkevitch在Arduino上编写代码并不难(尽管我不得不承认我在指针方面有问题)。谢谢你,谢谢你的帮助!我认为如果不在全球范围内定义I的长度,就无法声明I是全局的,对吗?因此,我必须选择(2)@马塞尔:定义
    inti[2]有什么区别在全局范围内,或