我有以下代码:
int *edges[500];
char arr[] = {'c','d'};
edges[0] = arr;
printf("%c - %c", edges[0][0],edges[0][1]);
我想要显示的是c - d
但实际显示的是c -
所以正如您在上面看到的,显示的是第一个元素而不是第二个元素。
为什么不显示数组的第二个元素?
我有以下代码:
int *edges[500];
char arr[] = {'c','d'};
edges[0] = arr;
printf("%c - %c", edges[0][0],edges[0][1]);
我想要显示的是c - d
但实际显示的是c -
所以正如您在上面看到的,显示的是第一个元素而不是第二个元素。
为什么不显示数组的第二个元素?
由于 anint
和 a 的char
大小不同,您应该尝试char *edges[500]
类型不匹配。edges
是一个包含 500 个指向 int 的指针的数组,您将一个指向两个字符的指针分配给它的第一个元素。
那么,
tc:6: 警告:来自不兼容指针类型的赋值
消息可能与它有关。
在 C 中,'c'
是一个(小)整数。您将它们存储为char
s arr
。但是,通过arr
as edges[0]
which is an访问int *
,您实际上是在检索(在大多数平台上)arr[0]
, arr[1]
,arr[2]
和arr[3]
作为整数。
edges[0]
被解释为带有元素 {(int)'cd' , 0} 的 int 数组(实际上,第二个元素可以包含任何垃圾)。
带有说明符 %c 的 printf 获取edges[0][0]
(即“c”)的第一个字节和edges[0][1]
(恰好为 0)的第一个字节。
将类型更改edges
为char* edgeds[500]
。
3号线
edges[0] = arr;
赋值中的不兼容类型:arr
is achar *
和edges[0]
is a int *
。
会发生什么:
int *edges[500];
char arr[] = {'c','d'};
arr[0] 是 'c' 而 arr[1] 是 'd'
edges[0] = arr;
忽略类型兼容性,edges[0] 指向int
'c' 和 'd' (可能还有两个未指定字符)所在的地址。
printf("%c %c", edges[0][0],edges[0][1]);
边缘[0][0] 是边缘[0] 中的第一个整数:它是“c”、“d”(可能还有两个未指定的字符)的混合。该值被转换为无符号字符,产生被打印的“c”。
edge[0][1] 指向紧接在 'c'、'd' (可能还有两个未指定字符)的混合之后的整数。该内存位置尚未初始化,它很可能超出您的进程可以访问的范围。
如果您打印一个 int 而不是 2 个字符
printf("%d\n", edges[0][0]);
您将看到“c”、“d”(可能还有两个未指定的字符)的混合。
最好的办法是让你的类型正确。
edges
是一个指向 int 的指针数组。该表达式edges[0]
产生一个指向 int 的指针,而不是指向 char 的指针。将其视为 char 数组会导致计算错误的字节偏移量,从而导致显示意外内存的值,而不是保存 char 值“d”的内存。
数组偏移量根据指向的类型的大小计算偏移量(以字节为单位):
foo_t * x;
ptrdiff_t difference = x[1] - x[0];
的值difference
将是sizeof(foo_t)
字节。sizeof(char)
定义为 1,sizeof(int)
通常为 4,这意味着您的代码将取消引用 char 数组中 4 个字节的值,而不是 char 数组中的 1 个字节。