在我的代码中,我有这个 typedef char:
typedef char chessPos[2];
当我尝试调试并查看我尝试输入的值时
chessPos* pos;
*pos[0] = 'C';
*pos[1] = '3’;
调试后,我发现数组中的值如下(不是字符串,所以我不需要 \0),由于某种原因字符 '3' 不在数组中,而是得到了 \0。
我该怎么办?谢谢
应避免使用typedef隐藏数组和指针。这会使代码难以阅读,并导致奇怪的意外副作用。
在你的情况下,chessPos*
实际上是一个char(*)[2]
类型,*pos[0]
会给你在这样的数组指针类型上进行指针算术运算(在解引用之前)。
此外,你无法“存储值在指针内”,这没有任何意义。指针需要指向有效的内存和存储在该指针所指向的内存中的值,请参见将数据复制/扫描/读入未初始化指针时的崩溃或“分段错误”。
在typedef中删除数组类型。如果需要自定义类型,请改用结构体。
typedef struct
{
char coord[2];
} chessPos;
chessPos pos = { 'C', '3' };
在您的代码中,您定义了指向两个元素字符数组的指针。它并没有为该数组分配内存。如果您对此指针进行解引用操作,会导致未定义的行为。
在您的代码中,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]);
}
pos
是一个未初始化的指针,访问它是未定义的行为。 - mch