我的代码有什么问题?该程序只是终止而没有错误声明
What is wrong in my code? The program just terminates without error statement
#include<stdio.h>
struct stucture
{
int info;
};
typedef struct stucture * ts;
int main()
{
ts exp;
exp->info=10;
printf("working");
}
我不知道这段代码有什么问题。不打印报错,求解决办法。程序刚刚终止。
将指针隐藏在 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()
语句,否则您将 运行 陷入另一个问题:内存泄漏。
那个指针没有指向任何有效的地方。您可以这样做以获得有效结果。
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
?
#include<stdio.h>
struct stucture
{
int info;
};
typedef struct stucture * ts;
int main()
{
ts exp;
exp->info=10;
printf("working");
}
我不知道这段代码有什么问题。不打印报错,求解决办法。程序刚刚终止。
将指针隐藏在 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()
语句,否则您将 运行 陷入另一个问题:内存泄漏。
那个指针没有指向任何有效的地方。您可以这样做以获得有效结果。
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
?