C seg中的错误双指针在结构内部而不是在它之外。

时间:2017-08-24 10:24:13

标签: c pointers struct segmentation-fault

所以这是一个非常好的简单任务:

int **a = malloc(sizeof(int*));
int *b;
a[0] = b;

但是当我尝试通过指向struct的指针在结构中执行相同的操作时:

typedef struct jojo
{
  int **a ;
}jojo;

让我说我分配一个指向jojo的指针,称为alpha有很多空间,比如100个整数......

jojo *alpha = malloc(sizeof(int)*100);
int *b;
alpha->a[0] = b;

这里存在分段错误。 我完全迷失了,所以我在寻求帮助。感谢。

3 个答案:

答案 0 :(得分:1)

当你这样做时

malloc

你只为结构分配内存(并且不仅仅是结构所需的内存),而不是内部成员指向的内容。更糟糕的是a没有初始化它分配的内存,其内容将不确定

最后一部分意味着指针jojo *alpha = malloc(sizeof *alpha); // Allocate memory for the structure alpha->a = malloc(100 * sizeof *alpha->a); // Allocate memory for a 100 pointers to `int` 看似随机,解除引用它将导致undefined behavior

要解决您的问题,您需要先为结构分配内存,然后为结构内的指针分配内存:

Option Explicit

Public Sub TestMe()

    Dim myDict          As Object
    Dim lngCounter      As Long
    Dim strKey          As String
    Dim objKey          As Object

    Set myDict = CreateObject("Scripting.Dictionary")

    For lngCounter = 1 To 14
        strKey = Cells(lngCounter, 1) & Cells(lngCounter, 3)
        If myDict.exists(strKey) Then
            myDict(strKey) = myDict(strKey) + 1
        Else
            myDict(strKey) = 1
        End If
    Next lngCounter

    For lngCounter = 0 To myDict.Count - 1
        Cells(lngCounter + 1, 6) = myDict.Items()(lngCounter)
        Cells(lngCounter + 1, 7) = myDict.keys()(lngCounter)
    Next lngCounter

End Sub

答案 1 :(得分:0)

a没有指向任何地方。你只为结构保留了内存。您还必须为a保留内存。

int *b;

//Reserve memory for 100 structures
jojo *alpha = malloc(sizeof(*alpha)*100);

//Reserve memory for a pointer on first structure
alpha->a = malloc(sizeof(*alpha->a)*1);
alpha->a[0] = b;

我要告诉你,如果b没有值,那么如果你取消引用它就是未定义的行为

另外,请检查我如何使用sizeof关键字中的参数来检测要分配的内存大小。

答案 2 :(得分:0)

首先,

r0 = 0x00009000
r1 = 0x00000007
r2 = 0x00000008
r3 = 0x00000009

错误,因为 jojo *alpha = malloc(sizeof(int)*100); alpha无关,一旦发生变化,您就会遇到麻烦。如果您的意思是(或实际上您想要)

sizeof (int) * 100

或更好,

 jojo *alpha = malloc(sizeof(jojo)*100);

那就是说,你只为 jojo *alpha = malloc(sizeof(*alpha)*100); // no dependency on hard-coded type 分配了内存,而不是它的成员!

您还需要让会员alpha 指向某个有效的内存位置 ,然后才能取消引用它。