C 指向数组的全局指针
似乎我仍然没有正确地理解C语言中的指针 我希望全局数组(指针)j的长度是动态的 我有这个(Arduino)代码 我怎样才能做到这一点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! 即使这些值丢失了
提前谢谢你 这是因为数组
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]有什么区别代码>在全局范围内,或