Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C指针问题_C_Pointers_Embedded - Fatal编程技术网

C指针问题

C指针问题,c,pointers,embedded,C,Pointers,Embedded,在我的嵌入式c程序中,我有一个结构: struct var{ unsigned long value; unsigned long length; + More } 这些结构的数组用于保存变量。存储的大多数变量仅存储在“value”中,因此长度设置为1。 然而,其中一些变量是数组,我试图将起始地址存储在“value”中 unsigned long lookup[10]; variables[x].length = 10; 那么我不太确定如何存储地址 variable

在我的嵌入式c程序中,我有一个结构:

struct var{
    unsigned long value;
    unsigned long length;

    + More
}
这些结构的数组用于保存变量。存储的大多数变量仅存储在“value”中,因此长度设置为1。
然而,其中一些变量是数组,我试图将起始地址存储在“value”中

unsigned long lookup[10];
variables[x].length = 10;
那么我不太确定如何存储地址

variables[x].value = lookup;
// lookup is a pointer so I cant put it into value

我可能会放弃,在结构中添加一个指针变量

编辑:

我希望避免将指针添加到结构,因为我必须返回并重写flash读/写函数来保存指针。这些都是相当复杂的,目前的工作,所以我宁愿不碰他们

如您所示,您可以将地址强制转换为
无符号long
,将其存储在
值中。(我认为您得到的值是一个有效地址…十六进制,结果是0x20000EC4…看起来您的嵌入式系统的数据段从0x20000000开始,是吗?)

但是,将指针强制转换为int(或long)永远不会“干净”。为什么不加一个呢

unsigned long *starting_address;

到你的结构?这样你就可以避免打字了。如果您担心这将需要更多内存,可以使用一个联合来存储
无符号长*起始地址
或“无符号长值”,这仍然比强制转换更干净。

我不认为在结构中放置指针有什么坏处。是否希望内存处于连续块中?你可以这么做

struct var
{
   unsigned long *value;
   unsigned long length;

   unsigned long othervalue1;
   unsigned long othervalue2;
};
但不要忘记使用malloc分别为值分配内存。或者如果它是一个固定数量的空间,你想使用

unsigned long value[50];

如果使用sprintf+uart查找,会发生什么。这给了你什么价值

除非涉及铸造或标志扩展,实际数据是相同的。sprintf只是对它有不同的解释


只使用指针的解决方案很好。如果您真的想使用int,那么应该使用intptr\t,它保证足够大,可以容纳指针。

更干净的选择是使用union

 struct var{
     union {
        unsigned long numeric;
        void *ptr;  
     } value;
     unsigned long length;

     + More
 }

您还可以选择包括一个类型枚举,这与使用片段的并集通常是一样的。

假设系统指针大小与无符号长字符串的大小相同(无gaurantee,请使用
sizeof
检查),您将使用强制转换。但这是混乱和容易出错的。请考虑使用一个联合。< /P>
struct var{
    unsigned short type;
    union {
        unsigned long i;
        void *p;
    } value;
    unsigned long length;

    + More
}

当长度为1时,为什么不将该值设置为一个长度数组?无论如何,您将不会使用更多的空间。

我不确定您为什么不将值定义为无符号长*

相反,请执行以下操作:

struct var{
  union{
    unsigned long solo_value;
    unsigned long* multi_values;
  }

  unsigned long length;
  + More
};
此外,对齐规则在堆栈上的强制作用不如在堆中的强*。不过,如果您使用的是任何最新的编译器,它们无论如何都应该是。。。你可能在用sprintf砸东西。使用调试器或更可靠的工具提取值


*从技术上讲,malloc()等人强制执行8字节对齐规则,而不是语言。

您的最佳选择是使用枚举,如前所述:

typedef struct var{
     union {
        unsigned long numeric;
        void *ptr;  
     } value;
     unsigned long length;

     // + More
 } composition_t;
然后使用lenght成员来区分数据类型:

composition_t array[2];
unsigned long lookup[10];

// Just a plain unsigned long value
array[0].value.numeric = 100;
array[0].length= 1;

// An array of 10 long values
array[0].value.ptr= lookup;
array[x].length = 10;

请记住,无符号long不能保证包含指针,尽管它在嵌入式系统中很可能包含指针。像其他答案所建议的那样,做标准的事情并使用工会。在任何符合标准的实现中,工会都会做正确的事情,而不仅仅是你现在正在使用的。此外,它还具有说出您的意思的优势,当没有立即摸索代码的人(可能是您,一年后)不得不处理代码时,这一点总是很有价值的。

您知道偏移吗?

我不确定您真正想做什么,但在同一个结构中存储一个结构成员的地址似乎是不必要的


还有一个宏容器(google it),它是使用offsetof构建的,这可能也很有用。

为什么536874692不能是一个有效地址?刚刚意识到这一点。536874692是20000EC4,这可能是有效的…请注意,如果您的“闪存读/写函数”不知道查找是指针,它们将不知道保存它指向的数据。我希望避免将指针添加到结构,因为我必须返回并重写闪存读/写函数以同时保存指针。闪存中只存储值,手动填充所有其他结构成员(未显示)。看来0x20000EC4有效,谢谢。
composition_t array[2];
unsigned long lookup[10];

// Just a plain unsigned long value
array[0].value.numeric = 100;
array[0].length= 1;

// An array of 10 long values
array[0].value.ptr= lookup;
array[x].length = 10;