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

What is wrong in my code? The program just terminates without error statement

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

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

我不知道这段代码有什么问题。不打印报错,求解决办法。程序刚刚终止。

将指针隐藏在 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() 语句,否则您将 运行 陷入另一个问题:内存泄漏。

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

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?