无法通过指针 [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-&gt;p_name = "a" 也是错误的,你分配的 int a char a const char* 我在我的示例中修复了

【讨论】:

非常感谢您的回复。它现在完美运行。另一件事,为什么不需要在 malloc 表达式之前执行类型转换?我知道 malloc 总是返回一个指向已分配内存的 void 指针。这种类型转换是自动执行的吗? @Luke__ 您不必进行类型转换,因为它是在属性时进行转换的。

以上是关于无法通过指针 [C] 为结构的变量赋值的主要内容,如果未能解决你的问题,请参考以下文章

c语言赋值是啥?

C语言 NULL赋结构体指针变量

C\C++指针变量怎么赋值给普通变量。

在C语言中.结构体变量之间可以相互赋值吗

c语言char和int可以互相赋值,但指针不能赋值,char *和int *不能直接赋值,为啥呢?谢谢

C语言结构体指针成员所指向的变量如何访问?