#include<stdio.h>
struct stucture
{
int info;
};
typedef struct stucture * ts;
int main()
{
ts exp;
exp->info=10;
printf("working");
}
我不知道这段代码有什么问题。不打印错误语句以便寻找解决方案。该程序刚终止。
答案 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
?