【问题标题】:execute bad access and nested structure执行错误的访问和嵌套结构
【发布时间】:2020-06-26 00:02:42
【问题描述】:

我对此程序执行错误访问有任何错误。

  1. 首先,我有 3 个结构。
    struct format {
        int initialCyclicShift;
        int nrOfSymbols;
        int startingSymbolIndex;
        int formatID;
    };
    
    struct  PUCCH_Resource {
        //38.331 maxNrofPUCCH-Resources = 128
        int pucch_ResourceId;
        int startingPRB;
        int intraSLotFrequencyHopping;
        int secondHopPRB;
        // 5 formats in PUCCH, 38.211. Also in 38.331
        struct format (*formatList)[5];    //(*formatList) is a pointer that points to the whole array of size 5. The element of the array is a struct format
    };
    
    struct PUCCH_ResourceSet {
        // 38.331 maxNrOfPUCCH-ResourceSet=4
        int pucch_ResoureSetId;
        // 38.331 maxNrofPUCCH-ResourcePerSet = 32; for Initial Access: maxNrofPUCCH-ResourcePerSet = 16. There could be repetition of pucch resource in different sets.
        struct PUCCH_Resource (*ResourceList)[32];
    };
  1. 然后我初始化指针,指向父结构 PUCCH_ResourceSet 和子结构。
    struct PUCCH_ResourceSet *pucch_ResourceSetPtr = (struct PUCCH_ResourceSet*) malloc (sizeof(struct PUCCH_ResourceSet));

    pucch_ResourceSetPtr->ResourceList = malloc(sizeof(struct PUCCH_Resource));
    
    for (int i = 0; i <32; i++){
        for (int j = 0; j <5; j++)
            pucch_ResourceSetPtr->ResourceList[i]->formatList[j]= malloc(sizeof(struct format));
    }

(编辑)我尝试按照下面成员的建议初始化所有结构,但仍然遇到同样的问题。

  1. 然后尝试为结构的每个成员分配值的 get 函数,例如:
    pucch_ResourceSetPtr->ResourceList[0]->pucch_ResourceId=0;                       
    pucch_ResourceSetPtr->ResourceList[0]->startingPRB = 0;
    pucch_ResourceSetPtr->ResourceList[0]->formatList[0]->formatID=0;  //this is where I have the error

上面这行代码是第一行给struct的成员赋值;这是我有错误的地方。

在窃听时,我看到当PUCCH_ResourceSet 时,它看到一个内存块被分配给结构,它的子结构PUCCH_Resource,而不是它的孙结构,格式如下面的屏幕截图所示。

我怀疑是这个问题,但不明白为什么没有为格式结构分配内存块。

此外,在对代码进行一些操作以将内存分配给结构成员之后,我在格式结构处出现构建错误:

有谁知道这种行为的原因以及我该如何解决?

【问题讨论】:

  • 我只初始化了父结构体,相信所有子结构体都会得到照顾。。没有。相信并没有做到这一点(至少在 C 内存分配中没有)。你必须自己做。
  • 您甚至没有展示如何初始化父结构。放心,malloc() 一般不会初始化;你有一个无效指针数组(不保证为NULL,不保证特别指向任何地方,甚至不保证指向任何有效的地方)。这是 C。您必须注意内存管理细节,因为该语言没有。
  • 大家好,感谢您指出我必须初始化嵌套结构的所有成员结构;否则,将发生 bad-access-memory 错误。但是,仍然存在问题。基本上我能够为 1 个子结构分配内存,但不能为孙结构分配内存。在这种情况下,它是嵌套在侧 PUCCH_resource 中的格式结构。如果我不能正确地为成员结构格式分配内存,仍然会发生错误的内存访问。我在这里声明嵌套结构的方式有问题吗?

标签: c dynamic-memory-allocation


【解决方案1】:
  1. 首先在嵌套结构中,我必须为结构分配内存。

  2. 结构中存在多个问题,导致我分配内存的方式出现问题。例如,我使用指向任何数组的指针而不是指针数组。

     struct format (*formatList)[5];     //this is no array of pointer but a pointer to the beginning of an array.
    

我应该只使用:

`struct format *formatList[5];`

因此,我无法在步骤 1 中正确分配内存。

声明结构的合适代码如下。

struct PUCCH_ResourceSet *pucch_ResourceSetPtr = (struct PUCCH_ResourceSet*) malloc (sizeof(struct PUCCH_ResourceSet));

printf("%d", sizeof(struct PUCCH_Resource*));
for (int i = 0; i <32; i++){
    pucch_ResourceSetPtr->ResourceList[i] = malloc(sizeof(struct PUCCH_Resource));
    
    for (int j =0; j <5 ; j++)
    {
        pucch_ResourceSetPtr->ResourceList[i]->formatList[j] = malloc(sizeof(struct format));
    }
}

【讨论】:

    猜你喜欢
    • 2017-02-19
    • 2021-09-15
    • 2019-06-24
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多