【问题标题】:segmentation fault for setting a variable equal to 0 [closed]将变量设置为等于 0 的分段错误 [关闭]
【发布时间】:2013-09-17 20:16:32
【问题描述】:

我有一个带有两个指针和一个 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;

【问题讨论】:

  • 因为ptr 没有引用您分配的内存。所以你的陈述是试图修改内存中的一些随机位置。您需要将ptr 分配给A_ 类型的结构。
  • ptr 未初始化。您正在调用 UB。所有的地狱都崩溃了。
  • 如果人们要否决这个问题,请至少像上面的人一样发表评论。
  • 问题的问题在于没有足够的代码来提供答案。用户在对另一个答案的评论中表示,他为该结构分配了内存,因此向我们展示更多代码可能会有用。
  • 我们还需要多看一点。您的main 中还有其他内容吗?您应该向我们展示编译并导致错误的最小程序。您还在问题中写了typdef 而不是typedef;我认为这只是一个错字,否则程序根本无法编译。

标签: c pointers struct


【解决方案1】:

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

编辑:您在代码的其他地方做错了什么。以下compiles and runs to completion。您应该根据以下内容对您的代码进行建模:

#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、内存管理的信息,并花一些时间使用您选择的调试器。

【讨论】:

  • 我为结构做了 structA 大小的 malloc 内存,我还为两个指针做了 malloc 内存。
  • 您的问题并不清楚。我建议您编辑您的问题以包含您的问题的SSCE
【解决方案2】:

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

这样做:

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;
}

更多信息请参考这篇文章:

Difference between declared string and allocated string

【讨论】:

  • 我做了 StructA *ptr=malloc(sizeof(StructA));那么它不应该指向内存吗?
  • 请参考上面的修改。
【解决方案3】:

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

#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-&gt;i = 0; 行之前为 ptr 分配了另一个值?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2015-07-02
    • 2017-02-03
    相关资源
    最近更新 更多