我的代码有什么问题?该程序刚刚终止,没有错误声明

时间:2017-11-26 07:24:32

标签: c pointers structure

#include<stdio.h>
struct stucture
{
    int info;
};
typedef struct stucture * ts;

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

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

2 个答案:

答案 0 :(得分:6)

隐藏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()语句,否则你会遇到另一个问题:内存泄漏。

答案 1 :(得分:6)

该指针指向无效。您可以这样做以获得有效的结果。

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