【问题标题】:get address of pointer to first element of array and copy all elements to new buffer获取指向数组第一个元素的指针的地址并将所有元素复制到新缓冲区
【发布时间】:2020-03-04 13:21:51
【问题描述】:

我正在做以下事情:

假设我有一个数组:

uint8 Array[100] = {25,33,48,20,.....}; 

存在执行以下操作的函数:

void getValues(uint8 **pvalues)
{
    *pvalues =&Array[0];        //Saves the address of first element of Array[]
}

稍后在我的代码中我有以下内容:

uint8 *pmyValues;
uint8 myBuffer[100];
uint8 i=0;

getValues(&pmyValues)

for (i;i<100;i++)
{
   (void)memcpy(&myBuffer[i], (uint8*)&pmyValues[i], sizeof(uint8));        
}

我想在我自己的内部缓冲区 pmyBuffer 中保存来自 Array ow 的值 调试后我看到 pmyBuffer 包含一个指针数组!? 不知道我做错了什么?我是 C 中指针的新手,如果有人能提供帮助,我将不胜感激。

谢谢!

【问题讨论】:

  • pmyBuffer 在哪里定义?看起来您正在尝试逐字节复制getValues,但您对memcpy 的调用是一次复制8 个字节。此外,您可以通过一次调用 memcpy 来复制整个数组,而无需循环。
  • 复制粘贴失败。现已更正。
  • 对memcpy 的更改是否解决了您的问题?你可以在没有循环的情况下做memcpy(myBuffer, pmyValues, 100 * sizeof(uint8));。
  • 具体来说,是什么让您认为pmyValues“包含”一个指针数组?它包含的内容——或者至少是如何解释的——取决于它的类型。它是一个指向uint8_t 的指针,它的值指向的东西(如果有的话)是uint8_t,可能是相同数组的第一个。
  • 你的代码应该复制了Array的内容。也许您的调试器无法猜出您想要的格式...

标签: c arrays pointers double-pointer


【解决方案1】:

您在问题中提供的代码没有意义。如果你想

获取指向数组第一个元素的指针地址并复制所有元素 到新的缓冲区

那么你就可以写了

memcpy( myBuffer, Array, 100 * sizeof( *Array ) );

这是一个演示程序

#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main(void) 
{
    enum { N = 10 };
    uint8_t Array[N] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' };
    uint8_t myBuffer[N];

    memcpy( myBuffer, Array, N * sizeof( *Array ) );

    for ( size_t i = 0; i < N; i++ )
    {
        putchar( myBuffer[i] );
    }
    putchar( '\n' );

    return 0;
}

程序输出是

ABCDEFGHIJ

如果由于某种原因您需要使用中间指针,那么代码可能如下所示。

#include <stdio.h>
#include <string.h>
#include <stdint.h>

void getValues( uint8_t **pvalues, uint8_t Array[] )
{
    *pvalues = Array;
}

int main(void) 
{
    enum { N = 10 };
    uint8_t Array[N] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' };
    uint8_t myBuffer[N];

    uint8_t *pmyValues;

    getValues( &pmyValues, Array );

    memcpy( myBuffer, pmyValues, N * sizeof( *pmyValues ) );

    for ( size_t i = 0; i < N; i++ )
    {
        putchar( myBuffer[i] );
    }
    putchar( '\n' );

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多