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)
我不知道这段代码有什么问题.不打印错误语句以便寻找解决方案.该程序刚刚终止.
隐藏指针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()语句,否则你会遇到另一个问题:内存泄漏.
该指针指向无效.您可以这样做以获得有效的结果.
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?