【问题标题】:What is wrong in my code? The program just terminates without error statement我的代码有什么问题?该程序只是终止而没有错误语句
【发布时间】:2017-11-26 07:24:32
【问题描述】:
#include<stdio.h>
struct stucture
{
    int info;
};
typedef struct stucture * ts;

int main()
{
   ts exp;
   exp->info=10;
   printf("working");
}

我不知道这段代码有什么问题。不打印错误语句以便寻找解决方案。程序刚刚终止。

【问题讨论】:

  • 不要在 typedef 后面隐藏指针语义...如果你没有隐藏,exp-&gt;info 可能会让你看起来更加可疑。
  • 你还没有为指针exp分配内存。在分配之前,您不能存储。首先使用malloc进行分配,然后初始化变量。

标签: c pointers structure


【解决方案1】:

那个指针没有指向任何有效的东西。您可以这样做以获得有效的结果。

struct structure ab;
ts exp = &ab;

现在,在您的程序之前,您访问了一些不确定的内存位置并且程序崩溃(未定义的行为)。

或者您可以动态分配内存以获得有效结果

ts exp = malloc(sizeof *exp);
if ( exp == NULL ) {
    fprintf(stderr, "Error in allocation");
    exit(1);
}
...
//do cool stuff with exp
...
free(exp);

当您使用malloc 动态分配内存时,必须释放内存。

那么出了什么问题?...

指针变量应该存储地址。现在ts实际上表示struct structure*

那么它将包含谁的地址? struct structure的地址。

最初exp 包含一些不确定的值。你甚至不知道它是否是一个有效的地址,或者它是否被允许访问它。您尝试访问它 - 这是未定义的行为。

当你这样做时

struct structure ab;
ts exp = &ab;

你基本上是让exp 指向ab 的地址。现在,当您取消引用它时,您可以访问一个有效的内存位置并对其进行更改。


在这里你也误解了你在 typedef 下隐藏了一个指针。

如果你这样做了

typedef struct structure ts;

然后如果你做这样的事情

  ts exp
  exp.info = 10;

那是有效的。


关键要点是:-

  • 不要将指针隐藏在 typedef 中,这会使您的程序管理更加困难。

  • 使用更好的命名struct structure 不是一个好名字。

  • Undefined behavior 到底是什么?

  • malloc怎么用?

【讨论】:

  • 我更愿意将 sizeof 之后的任何内容都用括号括起来。
  • @iBug.:没必要。这也有效。但是是的,您可以这样做。
【解决方案2】:

typedef 后面隐藏指针并仍然将它们用作指针是一个愚蠢的想法。

没有错误消息,因为您的程序在语义上是正确的,没有任何编译时错误。但是,这并不意味着也没有 runtime error

typedef 只为现有类型创建别名,因此

ts exp;

完全没有区别
struct structure *exp;

现在看起来更清晰了。有了这句话,你认为exp 会指向哪里?

被单元化后,它实际上可以指向内存中的任何地方,所以访问它肯定是undefined behavior。在尝试访问之前,您至少必须为其提供一个有效地址:

struct structure x;
exp = &x;

或动态分配:

exp = malloc(sizeof(*exp));
if (exp == NULL) {
    fputs("Failed to allocate memory", stderr);
    exit(1);
}
// Do stuff
free(exp);

不要忘记最后的free() 语句,否则你会遇到另一个问题:内存泄漏。

【讨论】:

  • @DavidC.Rankin 对不起,我不太明白“今晚”。我在中国,这里是 15:35 (GMT+8)?
  • 更正——今天(同样的后记)。
猜你喜欢
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
相关资源
最近更新 更多