c - 将值从简单表复制到 C 代码中指定地址的结构中的表时出现问题

标签 c pointers memory-address

当我想将值从一个表复制到结构中的另一个表(并且具有结构中表的指定地址)时,我遇到了此代码的问题。

我把代码示例放在下面。如果我使用 PtrTableStruct,则不起作用。如果我使用 PtrTableStruc2,它可以工作,但没有指定地址。有人可以帮助我吗:)

typedef struct
{
  unsigned short Table_Truc[256];
  unsigned short Table_Essai[256];
} ESSAI_STRUC_TABLE;

int main(int argc, char *argv[]) {
    unsigned char TheTable[2];

    ESSAI_STRUC_TABLE *PtrStruct = (ESSAI_STRUC_TABLE*) 0x1000000;
    unsigned char* PtrTableStruct = (unsigned char*) &PtrStruct->Table_Essai[0];

    unsigned char* PtrTableStruct2 = (unsigned char*) malloc(256 * sizeof(unsigned short));

    printf("address TheTable 0x%x\n",TheTable);
    printf("address PtrStruct 0x%x\n", PtrStruct);
    printf("address PtrTableStruct 0x%x\n", PtrTableStruct);
    printf("address PtrTableStruct2 0x%x\n", PtrTableStruct2);

    TheTable[0] = 100;
    TheTable[1] = 101;

    unsigned char * NewTable = TheTable;

    int iter;

    for(iter=0;iter<2;iter++){
        *PtrTableStruct++ = *NewTable++;  // that does not work
//      *PtrTableStruct2++ = *NewTable++;  // that works
    }

    return 0;
}

最佳答案

此作业:

ESSAI_STRUC_TABLE *PtrStruct = (ESSAI_STRUC_TABLE*) 0x1000000;   

可能不会做你期望的事情。没有任何迹象表明在地址 0x1000000 处分配了足够的内存,或者该位置由您的进程拥有。

一般来说,因为你有:

typedef struct
{
  unsigned short Table_Truc[256];
  unsigned short Table_Essai[256];
} ESSAI_STRUC_TABLE;

...然后您可以通过创建一个实例和一个指针来获取指向该结构体实例的指针:

ESSAI_STRUC_TABLE instanceOfTable[2] = {0}, *ptrToInstanceOfTable = NULL;

...并将指针分配给实例的地址:

ptrToInstanceOfTable  = &instanceOfTable[0];//pointer is pointing 
                                            //to legal memory owned by the process.

现在,ptrToInstanceOfTable 指向足以容纳 2 个 ESSAI_STRUC_TABLE 数组的内存区域。

基于同样的推理,这个陈述:

unsigned char * NewTable = TheTable;

可以写成:

unsigned char *NewTable = &TheTable[0];

关于c - 将值从简单表复制到 C 代码中指定地址的结构中的表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59377933/

相关文章:

c++ - png block 的 CRC32 计算与真实 block 不匹配

c++ - 在不使用指针的情况下,在 C++ 中返回 'Invalid Value' 类型的正确方法是什么?

delphi - 为什么在调用 Dispose 之前必须转换为特定的指针类型?

c - 动态分配指针数组到C中的结构

arrays - 将数组和结构传递给 C 函数

c++ - 填充 std::vector 时的不同地址

c - 是否可以仅使用 exec() 函数来实现内部 shell 命令(shell 内置命令)?

c - 使用 SizeOf 时收到警告

c++ - 构建一个项目,其中文件待定参数

memory-address - 如何正确计算地址空间?