C Seg故障,现在我';我已将我的结构数组设置为全局结构

C Seg故障,现在我';我已将我的结构数组设置为全局结构,c,arrays,struct,malloc,global-variables,C,Arrays,Struct,Malloc,Global Variables,(我知道使用全局变量通常不是一个好主意,但我的实验室结构让我相信这是必需的。) 基本上,我应该模拟一个缓存,我决定让缓存成为一个链表数组,其中每个节点都是一个名为“block”的结构,其中包含地址和有效指示符等信息 在我的原始代码中,我有(工作)声明: struct block **cache = malloc(sizeof(struct block)*numofsets); 但是,由于查看了我必须将缓存相关函数放入的文件,我意识到需要使用缓存的函数没有一个在其作用域内,并且我无法编辑它们,

(我知道使用全局变量通常不是一个好主意,但我的实验室结构让我相信这是必需的。)

基本上,我应该模拟一个缓存,我决定让缓存成为一个链表数组,其中每个节点都是一个名为“block”的结构,其中包含地址和有效指示符等信息

在我的原始代码中,我有(工作)声明:

struct block **cache = malloc(sizeof(struct block)*numofsets); 
但是,由于查看了我必须将缓存相关函数放入的文件,我意识到需要使用缓存的函数没有一个在其作用域内,并且我无法编辑它们,因此我决定避免这种情况的唯一方法是增加缓存的作用域,使其成为全局缓存


当我将声明
struct block**cache在main之外,带有
*cache=malloc(sizeof(struct block)*numofsets)在主目录中。当我运行代码时,它有一个seg错误。我使用打印语句来查找seg故障的来源,
malloc
行是罪魁祸首

我真的不知道如何解决这个问题。因为我使用的是C,所以我无法
malloc
主函数的全局外部,因为它会给我一个“初始值设定项非常量”错误,而摆弄指针会让我犯更严重的错误。而且,在我看来,这个声明/实例化在结构上与以前几乎相同

是什么导致此实例化不起作用?有没有办法修复它,或者我的实现注定要失败

编辑:我在这方面做了更多的尝试,我意识到问题不在于它是一个全局变量,而是由于某种原因,将声明与初始化分离会给我一个seg错误。不知道为什么会这样

*cache = malloc(sizeof(struct block)*numofsets);  
*
放在
缓存
之前,您指的是
缓存
指向的另一个指针

正确代码:

cache = malloc(sizeof(struct block)*numofsets);

请张贴您的密码。但首先,你看,你为什么要用malloc?struct block*cache[numofsets]“我使用print语句查找seg错误的来源”:尝试调试器,它实际上更容易、更快、更可靠,并准确地告诉您问题所在。如果
malloc()fault@Fredrik也许在运行时之前您不知道
numofsets
,或者您更希望将它放在堆中而不是堆栈中。哦,就是这样!非常感谢。没问题,伙计:-)附言。请检查答案作为你问题的答案(我知道你是新来的)。我认为这是一种正确的思维方式,但并不完全正确。您希望
cache
指向指针数组,而不是结构数组。关于
cache=malloc(sizeof(struct block*)*numofsets)?但一般来说,不要在调用
malloc()
时使用显式类型,让编译器来解决:
cache=malloc(sizeof(*cache)*numofsets)。这意味着“分配
numofsets
缓存所指向的元素”。由于
cache
是一个
struct block**
,它指向的是一个
struct block*
,而不是
struct block
。如果这是您的问题,则segfault不是来自
malloc()
,而是来自于对恰好位于同一行的
缓存的取消引用。