【问题标题】:Malloc an array inside a structMalloc 结构内的数组
【发布时间】:2015-07-30 07:25:49
【问题描述】:

我正在尝试 malloc 结构内的一个数组,但在运行程序时我不断收到分段错误。

compares 函数只是我正在测试的东西,所以它不应该是问题的一部分

typedef struct {
    char *string;
} prod_t;

int
main(int agrc, char **argv){
    int i = 0;
    prod_t *c = NULL;

    char str2[100] = "abcd";
    c->string = (char *) malloc( 5 * sizeof(char));
    strcpy(c->string,str2);

    compares(c->stock,str2,i);

    return 0;
}

【问题讨论】:

  • 你忘记为prod_t *c分配内存。
  • 添加c = malloc(sizeof *c);,然后添加c->string = malloc(5 * sizeof *(c->string));
  • 通常,在这种情况下,您会在调试器下运行程序,然后在某行看到它崩溃,然后检查该行上的变量值。在这种情况下,当您尝试访问 c->string 时程序崩溃时,您会看到 cNULL

标签: c arrays struct malloc


【解决方案1】:

首先,不要转换 malloc 的结果。您只需要在 C++ 中执行此操作。在 C 中,它实际上可以隐藏潜在的问题。

其次,您需要分配(或静态声明)您的结构。

第三,c->股票不存在。你的意思可能是 c->string。

typedef struct {
    char *string;
} prod_t;

int
main(int agrc, char **argv) {
    int i = 0;
    prod_t *c = malloc( sizeof( prod_t ));


    char str2[100] = "abcd";
    c->string = malloc( 5 * sizeof(char));
    strcpy(c->string,str2);

    compares(c->string,str2,i);

    return 0;
}

【讨论】:

  • 字符串文字自动得到一个 0 终止符,你不需要显式地这样做。
  • 什么,你希望我注意什么的 :) 我现在修好了。
【解决方案2】:

您需要先为结构分配空间,然后才能分配给string 成员:

prod_t *c = malloc(sizeof(prod_t));

另见Do I cast the result of malloc?

【讨论】:

    【解决方案3】:

    问题是您正在为字符串分配空间,但您根本没有分配结构。 c 仍设置为 NULL 并且您正在尝试取消引用它。

    在分配给其成员之前为结构分配空间

    prod_t *c = malloc(sizeof(prod_t));
    

    并且,作为 next-to-fix 错误的旁注:此字段不存在

    c->stock
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2016-02-26
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多