Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Extern_Unions - Fatal编程技术网

如何在C中使用外部联合数组?

如何在C中使用外部联合数组?,c,arrays,extern,unions,C,Arrays,Extern,Unions,我想使用一个类似于chux建议的联合数组 union { uint8_t u8[12]; uint16_t u16[6]; } *array_u; array_u = calloc(1, sizeof *array_u); assert(array_u); printf("array_u->u8[0] = %" PRIu8 "\n", array_u->u8[0]); array_u->u16[0] = 1234; printf("array_u->u16[

我想使用一个类似于
chux
建议的联合数组

union {
  uint8_t u8[12];
  uint16_t u16[6];
} *array_u;

array_u = calloc(1, sizeof *array_u);
assert(array_u);

printf("array_u->u8[0] = %" PRIu8 "\n", array_u->u8[0]);

array_u->u16[0] = 1234;
printf("array_u->u16[0] = %" PRIu16 "\n", array_u->u16[0]);
...
资料来源:

我想把它用作一个全局数组,不同的文件需要访问它。所以我尝试了
globals.h

extern union {
    uint8_t u8[12];
    uint16_t u16[6];
} *array_u;
typedef union {
    uint8_t u8[12];
    uint16_t u16[6];
} array_u_type;
extern array_u_type *array_u;
我想在这个文件
memory.c
中分配并释放它:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include "globals.h"

void allocate_array_u(void){
    array_u = calloc(1, sizeof *array_u);
}
array_u_t *array_u;

除了将
array\u
声明为
extern
,还需要定义变量
extern
只是说在其他地方找到定义。这个定义必须存在于某个地方

尝试以下方法

更改
globals.h
如下:

typedef union {
    uint8_t u8[12];
    uint16_t u16[6];
} array_u_t;

extern array_u_t *array_u;
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include "globals.h"

array_u_t *array_u; // <---------------- definition

void allocate_array_u(void){
    array_u = calloc(1, sizeof *array_u);
}
memory.c
中定义
array\u
,如下所示:

typedef union {
    uint8_t u8[12];
    uint16_t u16[6];
} array_u_t;

extern array_u_t *array_u;
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include "globals.h"

array_u_t *array_u; // <---------------- definition

void allocate_array_u(void){
    array_u = calloc(1, sizeof *array_u);
}
#包括
#包括
#包括
#包括
#包括“globals.h”

数组\u\u t*数组\u;// 您在包含
globals.h
的每个源文件中将
array\u
声明为外部符号,但它位于何处?每个变量都必须在某个地方定义;i、 e.未声明为
外部
和(可选)初始化

选择最合适的C文件并在其中写入:

union {
    uint8_t u8[12];
    uint16_t u16[6];
} *array_u = NULL;
最好使用
typedef
获取变量的联合类型的名称
array\u
,以避免定义它两次

写入
globals.h

extern union {
    uint8_t u8[12];
    uint16_t u16[6];
} *array_u;
typedef union {
    uint8_t u8[12];
    uint16_t u16[6];
} array_u_type;
extern array_u_type *array_u;
写入一个C文件(
memory.C
),例如:


在上面的示例中,用您喜欢的新数据类型的任何名称替换
array\u\u type

建议为union指定一个“标记”名称

union myunion 
{
    uint8_t u8[12];
    uint16_t u16[6];
};
然后在单独的语句中声明指向联合的指针的实例:

 union myunion *array_u = NULL;
然后将指向并集的指针设置为一个值:

array_u = calloc(1, sizeof union myunion);
注意:调用
assert()

相反,建议:

if( NULL == array_u )
{ // then calloc failed
    perror( "calloc for instance of union myunion failed: );
    exit( EXIT_FAILURE );
}

// implied else, calloc successful

注意:将文本“NULL”放在左边,因此出现击键错误,就像键入
=
而不是
=
会被编译器捕获,而不是你花费数小时寻找那些“oops”。

你在
globals.h
中将其命名为
数组,但在
memory.c
中分配给
数组。对不起,问题中的代码是错误的。我编辑了它。问题仍然存在。如果名称正确,并且您包含了标题(如在您的帖子中),我不明白为什么它不起作用。您仍然收到相同的错误?是的,我在源代码中没有收到警告,但在编译过程中收到错误。您收到的是链接器错误。你是如何编写整个项目的?(main()在哪里,您是否访问main()中的
array\u
,如果是,是否包括
globals.h
)。就是这样。忘了定义吧!谢谢!我看到你的评论差不多是在同一时间发表的。我道歉。我已经删除了我的评论。@Ziffusion-没问题。仔细阅读我的和你的答案,你会发现,虽然它们都为问题提供了相同的解决方案,但它们也提供了不同的小提示。无论如何,你的比我的更清楚;-)