C-我的代码中有什么问题?该程序只是在没有错误语句的情况下终止


#include<stdio.h>
struct stucture
{
    int info;
};
typedef struct stucture * ts;
int main()
{
   ts exp;
   exp->info=10;
   printf("working");
}

我不知道这件代码怎么了。没有打印错误语句以寻找解决方案。该程序刚刚终止。

指针没有任何有效。您可以这样做以获得有效的结果。

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 struct structure ts;

然后如果您做这样的事情

  ts exp
  exp.info = 10;

那是有效的。


关键要点是: -

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

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

  • 什么是未定义的行为?

  • 如何使用malloc

将指针隐藏在typedef后面,并且仍将其用作指针是一个愚蠢的想法。

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

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

ts exp;

完全没有区别
struct structure *exp;

现在看起来更清晰。在该语句中,您希望exp指向的位置?

被统一化,它实际上可以指向内存中的任何地方,因此访问它绝对是不确定的行为。在尝试访问之前,您至少必须给它一个有效的地址:

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

最新更新