无法通过指针 [C] 为结构的变量赋值
Posted
技术标签:
【中文标题】无法通过指针 [C] 为结构的变量赋值【英文标题】:Can't assign value to a structure's variable via pointer [C] 【发布时间】:2021-04-06 03:02:12 【问题描述】:我对 C 很陌生。我正在尝试创建一个简单的程序来使用结构来表示一个点。它看起来像这样:
// including standard libraries
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <assert.h>
// including user defined libraries
;
typedef struct point
char p_name;
double *p_coords;
point_t;
int main()
point_t *pt;
pt->p_name = "A";
printf("%c", pt->p_name);
// returning 0 if there are no errors
return 0;
问题是,当我在为它分配名称“A”后尝试打印点的名称时,程序除了退出代码(可能)是一个随机数之外什么都不输出:
Process finished with exit code -1073741819 (0xC0000005)
事实上,指针是一个我很难理解的概念(我以前用 python 编程过),因此我可能遗漏了一些东西。我也尝试过使用其他变量类型,例如 int,但结果是相同的(即使退出状态号相同)。有没有办法解决这种行为?
P.S.:对不起,我的初级英语,我还在练习,非常感谢你的时间!
【问题讨论】:
【参考方案1】:在您的代码中
pt->p_name = "A";
错误有两个主要原因:
-
您从未让
pt
指向任何有效的内存位置。尝试取消引用无效内存会调用未定义的行为。
p_name
的类型为 char
。 "A"
是 char [x]
类型的字符串文字,归结为 char *
用于赋值,它们不是兼容的类型。
你需要
-
确保
pt
指向有效的内存位置。实际上,这里根本不需要指针。将pt
定义为结构体类型的变量(不是指针变量),通过.
操作符访问成员。
使用'A'
进行赋值,如字符常量,而不是字符串。
【讨论】:
【参考方案2】:指针必须指向某处。您永远不会为指针 pt
分配值,并且尝试取消引用未初始化的指针值会调用 undefined behavior。
您还将字符串分配给字符值。字符串使用双引号,单字符使用单引号
对字符使用单引号,并且必须首先使指针指向某处:
point_t p;
point_t *pt = &p;
pt->p_name = 'A';
printf("%c", pt->p_name);
【讨论】:
【参考方案3】:你必须使用 malloc 来分配 poin_t 结构的内存。 类似的东西
point_t *pt = malloc(sizeof(point_t));
pt->p_name = 'A';
printf("%c", pt->p_name);
正如其他人所提到的,非常重要的是 pt->p_name = "a"
也是错误的,你分配的 int a char
a const char*
我在我的示例中修复了
【讨论】:
非常感谢您的回复。它现在完美运行。另一件事,为什么不需要在 malloc 表达式之前执行类型转换?我知道 malloc 总是返回一个指向已分配内存的 void 指针。这种类型转换是自动执行的吗? @Luke__ 您不必进行类型转换,因为它是在属性时进行转换的。以上是关于无法通过指针 [C] 为结构的变量赋值的主要内容,如果未能解决你的问题,请参考以下文章