【问题标题】:passing non-global array variable in C在C中传递非全局数组变量
【发布时间】:2013-12-04 21:02:04
【问题描述】:

C 对我来说是一门相当新的语言,我的大部分编程知识都是基于 Java 或基于 Web 的语言 - 所以如果我遇到这个问题的完全菜鸟,请不要客气!

我有一个 unsigned long 类型的数组,大小为 100000,在 main() 中声明。当满足用户输入的某个条件时,会进行record() 函数调用,该函数会启动一些硬件以开始录音(对于问题的范围而言并不重要)。

record() 函数调用中,只要寄存器中的“就绪”标志被初始化,寄存器的内容就会被复制到一个数组单元中——这个过程会迭代直到数组的所有 100000 个单元都被记录下来到。

来自record() 函数的数组现在需要返回到main() 中的变量。我通过简单地从方法调用中返回一个unsigned long 类型的变量来尝试这个 - 但我似乎无法完成这项工作。我也使用指针尝试过这个 - 但是当我尝试这个时,我对 C 的缺乏经验就显示出来了。

我使用指针的代码是:

int main(void){
    ...
    unsigned long recordingOne[100000];
    unsigned long *ptrOne;
    ptrOne = &recordingOne;
    ...
    initiateRecording(ptrOne);
}

void initiateRecording(unsigned long *ptr){
    unsigned long returnOne[100000];
    for(i = 0; i<100001; i++){
        returnOne[i] = AD0DR1 //AD0DR1 corresponds to hardware register
    }
    *ptr = returnOne;
}

为此,我收到两个警告:

(in function main) warning: assignment from incompatible pointer type [enabled by default]
(in function initiateRecording) warning: assignment makes integer from pointer without a cast [enabled by default]

当我之前在没有指针的情况下尝试过此操作时,我尝试将数组作为参数传递,然后返回一个数组。看起来像这样:

int main(void){
    ...
    unsigned long recordingOne[100000];
    ...
    recordingOne = initiateRecording();
}

unsigned long[] initiateRecording(){
    unsigned long toReturnOne[100000];
    for(i = 0; i<100001; i++){
        toReturnOne[i] = AD0DR1 //AD0DR1 corresponds to hardware register
    }
    return toReturnOne;
}

编译器也不喜欢这个 - 我正在努力声明一个 unsigned long 类型的返回对象,它也是一个数组。

一如既往,非常感谢您的帮助!

【问题讨论】:

  • 当前正在阅读,但将您的一个参考从 100001 更改为 100000
  • 天啊!我校对了它和一切!

标签: c arrays pointers long-integer unsigned


【解决方案1】:

这是最好的方法:

int main(void)
{
    ...
    unsigned long recordingOne[100000];
    unsigned long *ptrOne; // <<<--- Don't need this
    ptrOne = &recordingOne; // <<<--- Don't need this
    ...
    initiateRecording(recordingOne); <<<--- Pass address of array directly
}

void initiateRecording(unsigned long *ptr)
{
    for(i = 0; i<100000; i++) <<<---- If i == 100000 undefined behavior, such as a segmentation fault, may occur; change 100001 to 100000
        ptr[i] = AD0DR1 // <<<--- write directly to array
}

recordingOne 中的可访问元素从[0][99999]

【讨论】:

  • 如果 OP 想要使用 ptrOne 变量,请将分配更改为 ptrOne = recordingOne; 或者,如果这让他感觉更好 ptrOne = &amp;recordingOne[0];
  • +1 同意这是 OP 打算编写的代码,但似乎他对 C 语法有些困惑,所以可能可以了解为什么这些更改是他应该进行的更改
【解决方案2】:

这两个编译器警告的来源如下:当您初始化像int array[100]; 这样的C 数组时,符号array 是指向数组第一个元素的指针。所以当你写int *p = &amp;array之类的东西时,结果是p指向的不是array的开头,而是指向内存中保存指向array开头的指针的位置。你要的是int *p = &amp;array[0]

编辑:或int *p = array 也可以正常工作,正如另一个答案的评论中所指出的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多