C 我的代码有什么问题?程序只是在没有错误语句的情况下终止 #包括 结构 { 国际信息; }; typedef结构*ts; int main() { ts-exp; exp->info=10; printf(“工作”); }

C 我的代码有什么问题?程序只是在没有错误语句的情况下终止 #包括 结构 { 国际信息; }; typedef结构*ts; int main() { ts-exp; exp->info=10; printf(“工作”); },c,pointers,structure,C,Pointers,Structure,我不知道这段代码有什么问题。不会打印错误语句以查找解决方案。程序刚刚终止。将指针隐藏在typedef后面,并且仍然将其用作指针是一个愚蠢的想法 没有错误消息,因为您的程序在语义上是正确的,没有任何编译时错误。然而,这并不意味着也没有 typedef仅为现有类型创建别名,因此 #include<stdio.h> struct stucture { int info; }; typedef struct stucture * ts; int main() { ts exp

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

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

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

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

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

int main()
{
   ts exp;
   exp->info=10;
   printf("working");
}
绝对没有区别

ts exp;
现在看起来更清楚了。有了这句话,你希望
exp
指向哪里

被单位化后,它实际上可以指向内存中的任何地方,因此访问它肯定是一种选择。在尝试访问之前,您必须至少为其指定一个要指向的有效地址:

struct structure *exp;
或使用动态分配:

struct structure x;
exp = &x;

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

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

exp = malloc(sizeof(*exp));
if (exp == NULL) {
    fputs("Failed to allocate memory", stderr);
    exit(1);
}
// Do stuff
free(exp);
现在,在您的程序之前,您访问了一些不确定的内存位置,程序崩溃(未定义的行为)

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

struct structure ab;
ts exp = &ab;
使用
malloc
动态分配内存时,必须释放内存

那么出了什么问题?。。。 指针变量应该存储地址。现在,
ts
实际上表示一个
struct结构*

那里面装的是谁的地址<代码>结构结构的地址

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

在这儿等你

ts exp = malloc(sizeof *exp);
if ( exp == NULL ) {
    fprintf(stderr, "Error in allocation");
    exit(1);
}
...
//do cool stuff with exp
...
free(exp);
您基本上是让
exp
指向
ab
的地址。现在,当您取消引用它时,您将访问一个有效的内存位置并对其进行更改


在这里,您还错误地解释了您在typedef下隐藏了一个指针

如果你这么做了

struct structure ab;
ts exp = &ab;
如果你做了这样的事

typedef struct structure ts;
这是有道理的


关键的收获是:-

  • 不要将指针隐藏在
    typedef
    中,这会增加管理程序的难度

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

  • 到底是什么

  • 如何使用
    malloc


不要在typedef后面隐藏指针语义。。。如果您没有这样做,
exp->info
对您来说可能会更加可疑。您没有为指针
exp
分配内存。在分配之前,您不能存储。首先使用
malloc
进行分配,然后初始化变量。我更喜欢将
sizeof
之后的任何内容用括号括起来。@iBug:不需要。这也行得通。是的,你可以做到。@DavidC.Rankin抱歉,我不太懂“今晚”。我在中国,现在是15:35(格林尼治标准时间+8)更正——今天(同一个后记)。
  ts exp
  exp.info = 10;