-6

我有一个带有两个指针和一个 int 变量的结构。出于某种原因,我在线路上遇到了分段错误ptr->i=0;。这是为什么?我指的是内存中的某些东西,i它不是指针,所以它应该是合法的。谁能解释一下这是怎么回事?我确实为 struct 和两个 char 指针创建了内存。

struct A_ {
char *a;
char *b;
int i;
};

typdef struct A_ StructA;

然后在我的main()我有以下内容:

StructA *ptr=malloc(sizeof(StructA));
ptr->a=malloc(sizeof(char));
ptr->b=malloc(sizeof(char));

ptr->i=0;
4

3 回答 3

3

您没有指向内存中的任何内容,因为ptr尚未初始化。

编辑:您在代码的其他地方做错了什么。下面编译并运行完成。您应该根据以下内容对您的代码进行建模:

#include <stdio.h>

typedef struct A {
    int i;
} A;

int main(void) {
    A *a = malloc(sizeof(A));
    a->i = 42;
    printf("%d", a->i);
    free(a);
    return 0;
}

更重要的是,我建议花时间阅读有关 C、内存管理的知识,并花一些时间使用您选择的调试器。

于 2013-09-17T20:18:51.237 回答
1

您正在创建一个指向结构的指针,而不是结构本身,并且您正在访问一个未初始化的指针的成员。如果您坚持使用指向结构的指针,则必须首先创建一个实际结构以使其指向。

做这个:

StructA myStruct;
StructA* ptr = &myStruct;
ptr->i=0;

都修好了。

编辑:


您似乎不熟悉静态分配的内存(我上面的示例)和动态分配的内存(即:使用 malloc、calloc 等)。

另一种方法是:

StructA* ptr = malloc(sizeof(StructA));
if (ptr == NULL) {
    printf("Memory allocation error!\n");
} else {
    /* Malloc succeeded */
    ptr->i=0;
}

请参阅此帖子以获取更多信息:

声明字符串和分配字符串的区别

于 2013-09-17T20:19:30.567 回答
1

您提供的部分很好地组合在一起,只需多做一点工作:

#include <stdlib.h> /* stdlib.h contains declaration for malloc */

struct A_ {
    char *a;
    char *b;
    int i;
};

typedef struct A_ StructA; /* fixed a typo */

int main(void)
{
    StructA *ptr = malloc(sizeof(StructA));
    ptr->a = malloc(sizeof(char));
    ptr->b = malloc(sizeof(char));

    ptr->i = 0;

    return 0;
}

您的程序中的其他地方可能存在错误;您是否在该行之前为 ptr 分配了另一个值ptr->i = 0;

于 2013-09-17T20:48:37.090 回答