在C语言中,用typedef定义的char数组输入值时出现问题

3

在我的代码中,我有这个 typedef char:

typedef char chessPos[2];

当我尝试调试并查看我尝试输入的值时

chessPos* pos;
*pos[0] = 'C';
*pos[1] = '3’;

调试后,我发现数组中的值如下(不是字符串,所以我不需要 \0),由于某种原因字符 '3' 不在数组中,而是得到了 \0。

调试

我该怎么办?谢谢


2
你想用它做什么?pos是一个未初始化的指针,访问它是未定义的行为。 - mch
2个回答

3

应避免使用typedef隐藏数组和指针。这会使代码难以阅读,并导致奇怪的意外副作用。

在你的情况下,chessPos*实际上是一个char(*)[2]类型,*pos[0]会给你在这样的数组指针类型上进行指针算术运算(在解引用之前)。

此外,你无法“存储值在指针内”,这没有任何意义。指针需要指向有效的内存和存储在该指针所指向的内存中的值,请参见将数据复制/扫描/读入未初始化指针时的崩溃或“分段错误”

在typedef中删除数组类型。如果需要自定义类型,请改用结构体。

typedef struct
{
  char coord[2];
} chessPos;

chessPos pos = { 'C', '3' };

请注意,这也不是以空字符结尾的字符串,因此如果您打算将其用作这样的字符串,请将大小增加到3,并使用“C3”代替。

2

在您的代码中,您定义了指向两个元素字符数组的指针。它并没有为该数组分配内存。如果您对此指针进行解引用操作,会导致未定义的行为。

在您的代码中,ptr 引用了字符数组。当您 *pos[1] 时,您解引用了第二个字符数组的第一个元素,而不是数组中的第二个字符。要访问数组的第二个元素,您需要先解引用指针,然后使用索引 (*pos)[1]

您需要为字符分配内存:

#include <stdio.h>
#include <stdlib.h>

typedef char chessPos[2];

int main(void)
{
    chessPos* pos;
    pos = malloc(sizeof(*pos));
    (*pos)[0] = 'C';
    (*pos)[1] = '3';

    printf("(*pos)[0] = '%c', (*pos)[1] = '%c'\r\n", (*pos)[0],  (*pos)[1]);
}

https://godbolt.org/z/8nPxn3TxE

或者简化(不使用指针)

#include <stdio.h>

typedef char chessPos[2];

int main(void)
{
    chessPos pos;
    pos[0] = 'C';
    pos[1] = '3';

    printf("pos[0] = '%c', pos[1] = '%c'\r\n", pos[0],  pos[1]);
}

https://godbolt.org/z/h6fj7c1Ea


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接