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

Sha*_*nga 0 c pointers structure

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

int main()
{
   ts exp;
   exp->info=10;
   printf("working");
}
Run Code Online (Sandbox Code Playgroud)

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

iBu*_*Bug 6

隐藏指针typedef并仍然使用它们作为指针是一个愚蠢的想法.

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

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

ts exp;
Run Code Online (Sandbox Code Playgroud)

完全没有区别

struct structure *exp;
Run Code Online (Sandbox Code Playgroud)

现在看起来更清晰.有了这个陈述,你期望exp指向哪里?

由于是单元化的,它实际上可以指向内存中的任何位置,因此访问它肯定是一种未定义的行为.在尝试访问之前,您必须至少为其指定一个有效地址:

struct structure x;
exp = &x;
Run Code Online (Sandbox Code Playgroud)

或动态分配:

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

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


use*_*738 6

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

struct structure ab;
ts exp = &ab;
Run Code Online (Sandbox Code Playgroud)

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

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

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

使用动态分配内存时,必须释放内存malloc.

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

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

那么它的地址是什么?struct structure的地址.

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

当你这样做

struct structure ab;
ts exp = &ab;
Run Code Online (Sandbox Code Playgroud)

你基本上是exp指着ab地址.现在,当您取消引用它时,您将访问有效的内存位置并对其进行更改.


此外,您还误解了您在该typedef下隐藏了一个指针.

如果你这样做了

typedef struct structure ts;
Run Code Online (Sandbox Code Playgroud)

然后,如果你做这样的事情

  ts exp
  exp.info = 10;
Run Code Online (Sandbox Code Playgroud)

这是有效的.


关键要点是: -

  • 不要隐藏指针typedef,这会使管理程序变得更加困难.

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

  • 什么是未定义的行为

  • 怎么用malloc