在 C 数组中保存内存地址内容

Posted

技术标签:

【中文标题】在 C 数组中保存内存地址内容【英文标题】:Saving memory address content in C Array 【发布时间】:2017-07-04 14:47:17 【问题描述】:

我正在为音频实现 C 代码延迟。 我有一个接收音频样本的内存地址。还有另一个内存地址,指示新样本出现的位置。

我想要做的是记录第一个音频秒(48000 个样本)。为此,我声明了一个用于保存音频样本的数组。

在主循环中,我将实际样本和延迟(1 秒前)样本相加,这与我想要实现的回声非常相似。

问题是我的代码再现了实际的声音,而不是延迟的,事实上我每秒都能听到一点噪音,所以我猜它只读取了数组的第一个样本,其余的都是空的。

我已经分析了我的代码,但我不知道我的失败在哪里。我认为这可能与内存分配有关,但我对 C 语言不是很熟悉。你能帮帮我吗?

#define au_in (volatile short *) 0x0081050  //Input memory address
#define au_out (volatile short *) 0x0081040
#define samp_rdy (volatile int *) 0x0081030 //Indicates if a new sample is ready

/* REPLAY */
void main()
    short *buff[48000];
    int i=0;
    while(i<48000)
        if((*(samp_rdy + 0x3)==0x1)) //If there's a new sample
            *buff[i]= *au_in;
            i++;
            *(samp_rdy + 0x3)=0x0;
        
    

    while (1)
        i=0;
        while(i<48000)
            if((*(samp_rdy + 0x3)==0x1))
                *au_out = *buff[i]+(*au_in); //Reproduces actual sample + delayed sample
                *buff[i]=*au_in; //replaces the sample in the array for the new one
                i++;
                *(samp_rdy + 0x3)=0x0;
            
        
    

谢谢。

【问题讨论】:

我很确定你的代码应该会溢出堆栈... short *buff[48000]; --> short buff[48000]; ? 我推荐使用静态短buff[48000]。也请使用 for 循环! 你创建了buff 一个(未初始化的)指针数组。我猜你希望它是shorts 的数组。除了崩溃或无限循环之外,我很惊讶您得到任何结果。 您还必须将*buff[i]= *au_in 更改为buff[i]= *au_in。并使用-Wall 编译,以便您的编译器可以正确报告错误 【参考方案1】:

尝试以 C99 模式运行:

#define au_in (volatile short *) 0x0081050  //Input memory address
#define au_out (volatile short *) 0x0081040
#define samp_rdy (volatile int *) 0x0081030 //Indicates if a new sample is ready
#define SAMPLE_BUF_SIZE     (48000)


void main()

    static short buff[SAMPLE_BUF_SIZE];
    for(int i = 0; i < SAMPLE_BUF_SIZE; )
    
        if(*(samp_rdy + 0x3)) //If there's a new sample
        
            buff[i]= *au_in;
            *(samp_rdy + 0x3)= 0;
            i++;
        
    

    while (1)
    
        for(int i = 0; i < SAMPLE_BUF_SIZE; )
        
            if(*(samp_rdy + 0x3)) //If there's a new sample
            
                *au_out = buff[i] + (*au_in);   //Reproduces actual sample + delayed sample
                buff[i] = *au_in;               //replaces the sample in the array for the new one
                *(samp_rdy + 0x3)= 0;
                i++;
            
        
    

【讨论】:

你确定这行:*(samp_rdy + 0x3) == 0x01。您正在检查 0x0081033 处的内存是否为 0x01。 你帮了我很多。 for 循环与我的项目不兼容,但现在它可以完美运行。即使没有新样本,您的代码也会增加 i ,因此会引入很多噪音。使用我的 while 循环,我只在有新样本时增加索引。非常感谢您的宝贵时间。另外,我确定 *(samp_rdy + 0x3) == 0x01。如果有新样本,硬件(音频编解码器)正在那里写入。所以当我知道我有一个新的时,我把它写成'0'。每次新样本到达时,编解码器都会将值修改为“1”。 是的,这就是我纠正答案的原因。很高兴得到反对的理由。

以上是关于在 C 数组中保存内存地址内容的主要内容,如果未能解决你的问题,请参考以下文章

Java中自定义类和基本类型声明的数组,在对内存中存储的内容、方式和内存地址指向方面有啥区别?

面试中常被问到C/C++中数组,指针和引用的区别

c语言数组在内存中是怎么分配的?

内存地址的传递问题

C语言指针 ptr,*ptr,&ptr的含义?

C语言中整型数组的每个元素在内存中是如何存放的