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