简单的C数组问题

时间:2011-01-01 17:16:02

标签: c arrays struct initialization


#include <stdio.h>

#define MEM_SIZE 16

typedef struct memory_contents{
 unsigned char mem[MEM_SIZE]; /* memory */
} mem;

mem init(char prog[]){
 mem chip = {prog};
 return chip;
}

int main(int argc, char *argv[]){
 char memory[MEM_SIZE] = {0}; /* zero out whole array */
 mem chip = init(memory);

 printf("%d\n", chip.mem[0]);
    return 0;
}

我是否正确地认为这段代码的作用(具体来说,init函数)是否试图将变量'memory'的地址放入struct的数组中? (因此这就是它打印非零值的原因)

我想要实现的是初始化结构,使得struct的mem数组是prog []参数。这样做的首选或最佳方式是什么?我可以让struct的mem指向一个大小为MEM_SIZE的数组的第一个元素的指针,但我觉得这可能会导致问题:如果我稍后更改主内存中的内存数组,它也会更改芯片数组中的值

5 个答案:

答案 0 :(得分:1)

以下是推荐的方法:

#include <stdio.h>

#define MEM_SIZE 16

typedef struct memory_contents{
 unsigned char mem[MEM_SIZE]; /* memory */
} mem_t;

mem_t* init (char* arr)
{
    mem_t* info = (mem_t*) malloc (sizeof (mem_t));
    if (!info)
    return NULL:    /* No memory */

    memcpy (&info->mem, arr, MEM_SIZE);
    return info;
}

int main(int argc, char *argv[])
{
    unsigned char memory[MEM_SIZE] = {1,2,3,4,5,6,0};
    mem_t* chip = init (memory);
    if (!chip)
    return ENOMEM;

    printf("values: %d %d\n", chip->mem[0], chip->mem[1]);

    if (chip)
    free (chip);

    return 0;
}

还有一点要注意:尽量不要将结构字段成员名称和结构名称相同。它们可能会引发很多冲突。

答案 1 :(得分:0)

您无法更改结构的mem指针,因为它不是普通指针 - 名称mem只是该字段地址的名称。不要使用{ ... }表示法初始化数组;它只是难以阅读和混淆(它肯定让我感到困惑......)。请改用memcpy


编辑:

您的代码无法使用我的编译器进行编译:

error C2440: 'initializing' : cannot convert from 'char []' to 'char'
    This conversion requires a reinterpret_cast, a C-style cast or function-style cast

(错误在此行:mem chip = {prog};

我起初很困惑为什么你的代码甚至编译了,在这里检查之后,它是有道理的:就像我上面说的那样,你试图分配一个数组/指针到mem,这不是允许,因为mem只是数组地址的名称,而不是可以更改的指针。因此,您必须使用memcpy复制元素。

答案 2 :(得分:0)

  1. 使用memcpy复制数据
  2. 在func init中分配新内存,当func init结束时,'chip'将被恢复。

答案 3 :(得分:0)

以上所有内容都是将数据从缓冲区复制到结构中定义的包含缓冲区的推荐方法。

而且,回答你的问题 - 是的。 您正在使用指针值初始化数组。正如你在“内存”中所做的那样初始化数组: char memory [MAX_SIZE] = {0}; //数组初始化。

执行memcpy()是执行此操作的首选方法。另外 - 从函数返回本地结构是不好的做法 - 首选方法是在堆上分配一个对象并执行memcpy。 (虽然编译器可以通过额外的复制来优化它)这只是一种可怕的做法。

如果在编译时知道数组的结构: 其他可能性是c99结构初始化(通常在内核模式下完成): mem_t memObj = {    .mem = {1,2,3,4,5} }; 或者简单地说:mem_t memObj = {1,2,3,4,5}; (在你的例子中,因为它是唯一的成员)

注意:在进行数组初始化时,它类似于将数组中的其余元素归零 - 可能不是您期望/想要的。

答案 4 :(得分:0)

对于您的结构,您可以使用隐式struct-content-copy,如:

mem init(char *prog){
 return *(mem*)prog;
}

int main(int argc, char *argv[]){
 char memory[MEM_SIZE] = {0xAA,0xBB,0xCC,0xDD}; /* non zero test values */

 mem chip = init(memory);
 printf("%02X%02X%02X%02X\n",chip.mem[0],chip.mem[1],chip.mem[2],chip.mem[3]);

 memory[1]=0;
 chip = init(memory);
 printf("%02X%02X%02X%02X\n",chip.mem[0],chip.mem[1],chip.mem[2],chip.mem[3]);

 return 0;
}
相关问题